TUTORIAL

Python 教程 - 異常處理

我們在本教程中討論 Python 異常處理。

本頁內容

你將在本節中學習如何處理 Python 異常。此外,你將學習引發和捕獲異常。

當程式中發生異常時,程式執行將終止。但是大多數時候,你不希望程式異常終止,因此你可以使用 Python 異常處理來避免程式崩潰。

try...except

在下面的示例中,要求使用者輸入 10 個整數。如果使用者輸入其他型別而不是整數,則將引發異常並執行 except 中的語句:

>>> n = 10
>>> i = 1
>>> sum = 0
>>> while i <= n:
    try:
        num = int(input('Enter a number: '))
        sum = sum + num
        i = i+1
    except:
        print('Please enter an integer!!')
        break

    
Enter a number: 23
Enter a number: 12
Enter a number: Asd
Please enter an integer!!
>>> print('Sum of numbers =', sum)
Sum of numbers = 35

你還可以捕獲指定的異常,例如,如果發生被零除的情況,則可以捕獲對應的異常為:

try:
    # statements
except ZeroDivisionError:
    # exception handling
except:
    # all other exceptions are handled here

raise 異常

你可以使用 raise 關鍵字強制發生特定的異常:

>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError

>>> raise ValueError
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    raise ValueError
ValueError

如果需要向自舉異常新增一些自定義資訊,則可以將其新增到異常錯誤型別後的括號中。

>>> raise NameError("This is a customized exception")
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    raise NameError("This is a customized exception")
NameError: This is a customized exception

try...finally

finally 在異常處理 try 中是一個可選項。如果有一個 finally 塊,無論結果如何,程式都會執行它。

在以下示例中我們對此進行演示:

>>> try:
        raise ValueError
finally:
        print('You are in finally block')

    
You are in finally block
Traceback (most recent call last):
  File "<pyshell#23>", line 2, in <module>
    raise ValueError
ValueError

try...finally 結構用於清理操作,例如在處理檔案時,最好關閉檔案。因此,檔案將在 finally 塊中關閉。

Python 內建異常

在本節中,你將學習 Python 程式設計中的標準異常。

異常是解釋期間引發的執行時錯誤。例如,將任何數字除以零將產生一個稱為 ZeroDivisionError 的執行時錯誤。

在 Python 中,下面描述了一些內建的異常:

異常 什麼時候觸發?
AssertionError 當 assert 語句失敗
AttributeError 當 attribute 引用失敗時
EOFError 當 input() 函式未讀取任何資料併到達檔案末尾時
FloatingPointError 當浮點計算失敗時
GeneratorExit 當協程或生成器關閉時,GeneratorExit 發生異常
ImportError 當 import 找不到模組時
ModuleNotFoundError 當 import 找不到模組時。此異常是 ImportError 的子類
IndexError 當序列的索引不在範圍內時
KeyError 當在字典中找不到字典鍵時
KeyboardInterrupt 當按下中斷鍵時
MemoryError 當指定操作的記憶體量較少時
NameError 當找不到變數時
NotImplementedError 需要但不提供抽象方法的實現時
OSError 遇到系統錯誤時
OverFlowError 當值太大而無法表示時
RecursionError 當遞迴限制超過最大數量時
IndentationError 為任何函式,類等的定義正確指定縮排時
SystemError 當發現與系統相關的錯誤時
SystemExit 當 sys.exit() 用於退出直譯器時
TypeError 當操作對於指定的資料型別無效時
ValueError 當內建函式具有有效的自變數但提供的值無效時
RunTimeError 當生成的錯誤不在其他類別中時
IOError 當 I/O 操作失敗時
UnBoundLocalError 當訪問區域性變數但沒有值時
SyntaxError 當有語法錯誤時
TabError 當有不必要的製表符縮排時
UnicodeError 當遇到 Unicode 相關錯誤時
UnicodeEncodeError 由於編碼遇到 Unicode 相關錯誤時
UnicodeDecodeError 由於解碼遇到 Unicode 相關錯誤時
UnicodeTranslateError 由於翻譯而遇到 Unicode 相關錯誤時
ZeroDivisionError 當數字除以零時