介紹
簡要介紹Python的異常處理(try-except)。
基本語法
Try-except是Python中異常處理的基礎。
作為例子,我們將解釋執行除零時發生 ZeroDivisionError 的情況。
當除以零時,會出現以下錯誤。
print(1 / 0)
# ZeroDivisionError: division by zero
要捕獲此異常,請編寫如下。
try:print(1 / 0)
except ZeroDivisionError:print('Error')
# Error
如果 try 子句中出現異常名稱的錯誤,except異常名稱會中斷 try 子句中的代碼并執行 except 子句中的代碼。
此外,通過使用 except 異常名稱作為變量名,可以在變量中存儲和使用異常對象。 異常對象存儲錯誤消息,可以查看錯誤的詳細信息。
try:print(1 / 0)
except ZeroDivisionError as e:print(e)print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
還可以通過指定基類來捕獲。 例如,ZeroDivisionError 的基類是 ArithmeticError。 該變量存儲實際發生的派生類異常對象。
try:print(1 / 0)
except ArithmeticError as e:print(e)print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
對多個異常進行不同的處理
如果要捕獲多個異常并以不同的方式處理它們,請為每個異常設置 except 。
def divide(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)except TypeError as e:print('catch TypeError:', e)divide(1, 0)
# catch ZeroDivisionError: division by zerodivide('a', 'b')
# catch TypeError: unsupported operand type(s) for /: 'str' and 'str'
對多個異常執行相同的操作
通過在元組中指定異常名稱,可以使用一個 except 子句捕獲多個異常。
def divide(a, b):try:print(a / b)except (ZeroDivisionError, TypeError) as e:print(e)divide(1, 0)
# division by zerodivide('a', 'b')
# unsupported operand type(s) for /: 'str' and 'str'
捕獲所有異常并執行相同的處理
如果要捕獲所有異常,則無需指定異常名稱即可編寫。
try:print(1 / 0)
except:print('Error')
# Error
如果有多個 except 子句,則只能在最后一個 except 子句中省略異常名稱。 (就像 if 語句中的 elif 和 else 一樣)
正常結束處理:else
可以指定在 try 子句結束且 else 子句中不發生異常的情況下要執行的處理。
def divide(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)else:print('finish (no error)')divide(1, 2)
# 0.5
# finish (no error)divide(1, 0)
# catch ZeroDivisionError: division by zero
處理總是在終止時執行:finally
可以在finally子句中指定始終在最后執行的過程,無論是否發生異常。
def divide(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)finally:print('all finish')divide(1, 2)
# 0.5
# all finishdivide(1, 0)
# catch ZeroDivisionError: division by zero
# all finish
概括
- except 異常名稱:捕獲特定異常
- except 異常名稱作為變量名稱:將異常對象存儲在變量中
- except可以設置多個例外。
- 如果 except 中沒有指定異常名稱,則捕獲所有異常。
try:print(1 / 0)
except: # 如果try中出現異常print('Error')
else: # 如果try中沒有出現異常print('finish (no error)')
finally: # 無論異常如何發生,始終執行print('all finish')