1.1 錯誤的出現
錯誤(和異常)是程式設計的一部分。 當程式碰到無法處理的意外狀況時就會出現錯誤。在 Python 中,有一個異常處理系統, 能夠捕捉和處理錯誤,避免程式結束運行。
異常通常在以下情況下出現:
語法錯誤:
這些錯誤是在代碼編譯時發現的,與 Python 的語法錯誤有關。例如,漏掉的冒號或錯誤的關鍵字。
if True:
print("Hello")
運行時錯誤 (Runtime Errors):
這些錯誤在程式運行時出現,可能由多種原因引起,例如除以零、訪問不存在的列表索引、不正確地使用資料型別等。
print(1 / 0) # ZeroDivisionError
邏輯錯誤:
當程式運行沒有問題但輸出錯誤的結果時,就會出現邏輯錯誤。 由於程式邏輯錯誤,這些錯誤不會引發異常,且較難調試。
邏輯錯誤通常被稱為bug—這就像是程式功能的某種不足。運行時的錯誤被稱為異常。對於每個這樣的錯誤,Python 會創建一個特殊的對象(異常)並「拋出」它...
1.2 異常的路徑
當 Python 中發生異常時,它會沿著調用堆疊上升,直到被處理。調用堆疊是引發異常的函式調用順序。
異常上升機制
- 異常出現:當發生錯誤時,Python 會創建異常對象。
- 尋找異常處理器:Python 解釋器開始在當前代碼塊中尋找異常處理器。如果找不到處理器,它會轉到調用當前函式的下一個代碼塊。
- 沿著堆疊上升:此過程重複,直到找到處理器或堆疊用盡。
- 程式結束:如果找不到處理器,程式將結束並顯示錯誤信息。
例子:
def func_a():
func_b()
def func_b():
func_c()
def func_c():
print(1 / 0) # 這裡引發異常 ZeroDivisionError
func_a()
在這個例子中,異常 ZeroDivisionError 發生在函數 func_c 中,然後沿著調用堆疊上升經過 func_b 和 func_a。 如果沒有找到處理器,程式將以錯誤結束。
1.3 讀取日誌
當程式由於未處理的異常而結束時,Python 會輸出堆疊回溯(traceback),這能幫助開發者了解發生了什麼。堆疊回溯包含有關函數調用順序的信息,這些信息導致了異常的出現,可以用來調試程式。
堆疊回溯的例子
Traceback (most recent call last):
File "example.py", line 10, in
func_a() File "example.py", line 2, in func_a func_b() File "example.py", line 5, in func_b func_c() File "example.py", line 8, in func_c print(1 / 0) ZeroDivisionError: division by zero
堆疊回溯分析
- 異常類型和信息:在回溯的最後,顯示異常的類型和信息。在給出的例子中,是
ZeroDivisionError: division by zero。 - 調用順序:堆疊回溯顯示了函數的調用順序。在我們的例子中,錯誤出現在函數
func_c的print(1 / 0)行中,該函數由func_b調用,而func_b又由func_a調用。 - 文件和代碼行:在回溯的每一行中,都指出了發生調用的文件和行號。這有助於快速找到並修正代碼中的錯誤。
堆疊回溯的實際應用
堆疊回溯是進行程式調試和分析的重要工具。它能幫助開發者了解錯誤發生的原因,並找到發生錯誤的代碼位置。以下是使用堆疊回溯的幾個建議:
- 從下往上閱讀:從回溯中最下面的調用開始分析,因為這是異常發生的地方。
- 檢查所有調用:查看回溯中的所有調用,以了解異常傳遞的路徑。
- 修正代碼:使用回溯的信息來修正代碼,並防止未來出現類似的錯誤。
更多有關異常的內容將在接下來的講座中介紹。
GO TO FULL VERSION