跳轉到內容

文明/文明 IV/Modding/教程/Python 教程/除錯

來自華夏公益教科書,開放的書籍,為開放的世界


如果有人能幫我檢查一下這一節,我會很感激,因為我不確定它是否完全準確,而且由於我接下來的幾個月要離開電腦,所以無法測試它。

當指令碼無法正常執行時,每個人都必須進行除錯,因為犯一個小錯誤很容易,導致整個程式碼毫無意義。除錯的第一步是開啟遊戲內的除錯選項。為此,開啟 Civilization4.ini 檔案(確保備份),並將以下條目更改為以下值

HidePythonExceptions = 0
ShowPythonDebugMsgs = 1
LoggingEnabled = 1
MessageLog = 1

這將啟用遊戲內的 Python 彈出視窗,並將所有錯誤和訊息列印到您的我的文件/我的遊戲/文明 4/日誌目錄中。除錯時需要查詢的三個重要日誌檔案是 PythonDbg、PythonErr 和 PythonErr2。

常見的錯誤訊息及其原因

[編輯 | 編輯原始碼]

在日誌中,錯誤通常會有一個回溯。這個回溯列出了所有受錯誤影響的檔案以及發生錯誤的行號。最後一行通常是您感興趣的那一行,因為這是發生錯誤的那一行。有時您需要回溯幾步,因為錯誤不會出現在最後一行,但通常它就在那裡!

語法錯誤

[編輯 | 編輯原始碼]

這些主要是打字錯誤 - 遺漏的 ":"、不正確的空格或錯誤的括號。遊戲通常會在您載入遊戲時發現這些錯誤。錯誤日誌應該顯示您語法錯誤的確切位置,並在其下方用一個小的 "^" 符號標記出來。

引數錯誤

[編輯 | 編輯原始碼]

如果您嘗試將一個為指標設計的函式用於整數,則會得到一個型別錯誤。轉到指定的行,檢查您正在使用的函式是否有效。通常它會說明它期望的函式型別以及您提供的函式型別。注意:有些類在函式中需要 "()",有些不需要。如果您遇到型別錯誤,這可能是原因。

型別錯誤

[編輯 | 編輯原始碼]

當您傳遞給函式的引數過多或過少時,這些錯誤就會發生。您必須確保傳遞給函式的引數數量與函式接收的引數數量匹配,否則當您嘗試執行該函式時,該函式會丟擲一個錯誤。

名稱錯誤

[編輯 | 編輯原始碼]

這意味著您嘗試使用遊戲不知道是什麼的東西。例如,如果您要輸入 a = b,但沒有先宣告 b 是什麼,那麼計算機就無法為 a 設定值。請記住,a=b 與 b=a 的作用不同。此外,請確保您沒有在需要 " =" 的地方使用 " == ",反之亦然。

有時您會得到 "Argument referenced before assignment"。我不知道這是否與名稱錯誤有關,或者它是否需要自己的類別,但基本上它就像名稱錯誤,但是您在程式碼的後面定義了 "a"。

"列表索引超出範圍"

[編輯 | 編輯原始碼]

當您嘗試引用列表、元組或字典中不存在的索引時,就會發生這種情況。這個錯誤可能很難解決,您可能需要使用本節下一部分中描述的方法來檢視究竟發生了什麼錯誤。

以上是我現在能想到的所有錯誤訊息。我相當確定我遺漏了一兩個 - 如果您發現任何錯誤,請隨時詢問,我會將它們包含在這裡。正如我在開頭所說,我對這些錯誤的準確性不是 100% 確定,但它們應該是可以的。

程式碼行為不正常

[編輯 | 編輯原始碼]

所以你寫了你的程式碼。它執行起來沒有錯誤......但它並沒有真正產生你希望它在遊戲中產生的結果。這可能有幾個原因。

首先,如果您認為一段程式碼應該在遊戲中產生影響,請確保它是透過檢查 API 來檢視它是否是 VOID 函式。在剛開始學習時,經常會使用其他函式,以為它們會做某事,但實際上它們只是檢索資訊。

其次,如果一切看起來都正確,您需要開始在程式碼中新增除錯資訊。這部分內容會將您帶回到 Python 程式設計的最初階段,當時您告訴計算機列印 "hello world"。您需要做的是讓計算機列印一條訊息,告訴您程式碼中某個點的特定值的具體內容,並將它與您認為應該的值進行比較。例如,以下程式碼將在除錯日誌中列印 "a=b",如果 a=b,否則列印 a 和 b 的值。

if a == b:
	print "a=b"
else:
	print a
	print b

在除錯日誌中解讀這些資訊可能比較困難(通常會有很多很多數字),因此您可以使用更高階的訊息

if a == b:
	print "a = b, a and b are %d, and %d"%(a,b))
else:
	print("a = %d"%(a))
	print("b = %d"%(b))

其中 %d 將引用 "" 外面的數字,緊隨在 % 之後。如果您想在那裡放置一個字串,您必須使用 %s。這可以為您提供有關程式碼內部情況的詳細資訊,希望您能夠從中找出問題所在。

<--上一頁

華夏公益教科書