4.1 捕捉多個例外
Python允許通過多個except區塊或一個包含例外的元組except區塊來處理多個例外。讓我們來看看這兩種方法。
多個except區塊
你可以使用多個except區塊來針對不同類型的例外進行不同的處理。
try:
# 可能引發例外的代碼
result = int("abc")
except ValueError:
print("錯誤:無效值。")
except ZeroDivisionError:
print("錯誤:除以零。")
單個包含例外元組的except區塊
你可以在一個except區塊中處理多個例外,只需將它們作為元組傳遞。
try:
# 可能引發例外的代碼
result = int("abc")
except (ValueError, ZeroDivisionError) as e:
print(f"發生錯誤:{e}")
使用 except NameError as var
當處理例外時,你可以使用語法 except <ExceptionType> as <variable> 來獲取例外對象。這允許你訪問關於例外的信息,例如錯誤消息和其他屬性。
try:
# 可能引發 NameError 的代碼
print(undeclared_variable)
except NameError as e:
print(f"發生錯誤:{e}")
print(f"錯誤類型:{type(e)}")
4.2 錯誤變數的作用域
儲存例外的變數(在上面的例子中為 e)僅在其except區塊內可用。在該區塊之外,變數不可用。
try:
# 可能引發 NameError 的代碼
print(undeclared_variable)
except NameError as e:
print(f"發生錯誤:{e}")
print(f"錯誤類型:{type(e)}")
# 這裡 e 已經不可用,下一行將引發 NameError
# print(e) # NameError: name 'e' is not defined
如果你想在其區塊之外對例外進行一些重要的處理,那麼你需要將它儲存到一個單獨的變數中。例如:
exception = None
try:
# 可能引發例外的代碼
result = int("abc")
except ValueError as e:
exception = e
print("錯誤:無效值。")
except ZeroDivisionError as e:
exception = e
print("錯誤:除以零。")
print(exception)
請注意,變數exception保存了最後發生的例外,這在try區塊之外的後續處理中可能會有所幫助。
4.3 錯誤中有什麼有用的信息
例外對象包含關於錯誤的信息。根據例外類型,對象可能包含不同的屬性。
以下是大多數例外可用的一些常見屬性:
-
args:包含創建例外時傳遞的參數的元組。通常是錯誤消息。 -
message:包含錯誤消息的字符串(在某些例外中)。 -
__str__:返回例外字符串表示的方法。此方法用於從例外對象中獲取文本表示,這會在使用print()函數打印例外對象時返回。
範例:
try:
# 可能引發 ValueError 的代碼
result = int("abc")
except ValueError as e:
print(f"發生錯誤:{e}")
print(f"錯誤參數:{e.args}")
print(f"錯誤消息:{str(e)}")
多重例外處理示例
try:
# 可能引發多種類型例外的代碼
result = 10 / 0
except (ValueError, ZeroDivisionError) as e:
print(f"發生錯誤:{e}")
print(f"錯誤類型:{type(e)}")
print(f"錯誤參數:{e.args}")
如果發生ValueError或ZeroDivisionError,則會被except區塊捕捉。通過變數e可以訪問例外信息。輸出將包含錯誤類型和創建例外時傳遞的參數。
GO TO FULL VERSION