報錯訊息逐條解釋
104 條報錯訊息,逐條講清含義、起因和處理辦法。
修法都有代價。git reset --hard 會丟掉沒提交的工作,強制推送可能毀掉同事的提交,docker system prune 會刪掉未命名的卷。凡是這樣的條目,裡面都寫明了。
Git29
git 的錯誤幾乎都是一種拒絕,意思是「在目前狀態下做那件事會丟掉東西」;fatal: 表示它什麼都沒改就停了,而真正的解決辦法往往在第一行下面的 hint: 行裡。
npm20
npm 的原因寫在第一行 code XXXX 裡,而不是最後那六行 npm ERR!;如果失敗來自相依樹或原生編譯而不是你自己的程式碼,刪掉 node_modules 重新安裝就能解決一半。
JavaScript15
瀏覽器和 node 的錯誤通常只告訴你什麼壞了,不告訴你那個值為什麼變成這樣——你讀了 undefined、它不是函式、它不是 JSON——所以該修的地方在拋錯那一行的上游;只用 ?. 和預設值把那一行按住,同樣的問題會在更遠的地方、以更難辨認的樣子回來。
Python18
Python 的 traceback 把答案劈成兩半——最後一行說「錯了什麼」,上面的框說「錯在哪裡」——所以只讀最後一行,你會拿到名字卻丟掉位置;而 NoneType、KeyError 這類「值不存在」的錯誤,原因幾乎總在崩潰那一框的上面。
建置與型別10
建置階段的錯誤是工具在執行之前就先拒絕了,所以它們出現的那一刻並不弄壞什麼——但它們問你兩個問題:你要把型別或路徑改成和真實結構一致,還是用一個 as any、一條抑制註解讓那一行過去?也正是在這裡,那些只在你自己機器上成立的事情——大小寫、副檔名、環境變數——第一次顯形。
Docker12
docker 的錯誤要先歸到某一層才讀得懂——用戶端連不上守護行程、映像檔倉庫拒絕你、建置過程中某條 RUN 失敗、容器一起來就死掉,是四種不同的問題——而在建置和執行這兩層,那行字本身並不是原因:原因在裡面那條命令留下的輸出裡,各層修復的代價也不一樣。
怎麼讀報錯
- 從第一行往下讀。越往下越是工具內部的事,起因通常寫在最上面。
- 有檔名和行號就從那裡查——不是堆疊最上面那一格,而是最上面那條提到你自己寫的檔案的行。
- 把報錯原文照樣去搜,但先去掉你自己的路徑和變數名,正是那些讓搜尋比對不上。
- 同一種情況在不同版本裡措辭不同。結果不對頭,就把版本號一起加進查詢。
- 貼上修法之前,先確認它會丟掉什麼。這裡面有些是不能收回的。
常見問題
Q. 為什麼報錯原文不翻譯?
因為你要拿它去搜。工具輸出的是英文,翻譯過的原文什麼也搜不到。跟著語言變的只有含義和處理辦法。
Q. 我螢幕上的措辭略有不同。
工具在不同版本裡會改措辭。去掉你自己的路徑和名字後骨架一致,就是同一個報錯。版本不同就把版本號一起加進搜尋。
Q. 修法可以直接跑嗎?
先看它會丟什麼。git reset --hard、強制推送和 docker system prune 刪的東西回不來——凡是這類,條目裡都寫了。
Q. 這裡沒有的報錯怎麼查?
把報錯裡你自己的路徑、名字和數字去掉,只搜剩下的部分。那部分是工具作者寫的句子,用它搜才對得上。