6.1 故意拋出例外
在 Python 中你可以使用raise操作符故意拋出例外。這可以讓你在程序中標示出錯誤或不合適的情況。讓我們來看看使用raise操作符和重新包裝例外的不同方法。
拋出標準例外
此操作的常用語法如下:
raise exception
你可以通過傳遞相應的信息來拋出標準例外,例如Exception
,TypeError
等。
範例:raise Exception
def check_number(value):
if value < 0:
raise Exception("抱歉,不能低於零")
try:
check_number(-5)
except Exception as e:
print(f"捕獲到例外: {e}")
在此例中,如果值小於零,則會拋出Exception
並帶有消息"抱歉,不能低於零"
。
範例:raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("只允許整數")
try:
check_integer("string")
except TypeError as e:
print(f"捕獲到例外: {e}")
在這個範例中,如果值不是整數,則會拋出TypeError
並帶有消息"只允許整數"
。
6.2 重新包裝例外
有時需要捕獲一個例外並拋出另一個,提供更具體或有用的信息。這可以通過使用raise ... from操作符來完成,它將原始例外作為新例外的原因儲存。
此操作的常用語法如下:
raise new_exception from original_exception
範例:重新包裝例外
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("變數是空的")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("檢測到空變數") from e
在這個範例中,如果變數值為空,首先會拋出ValueError
,並帶有消息"變數是空的"
。這個例外隨後被捕獲,並且會拋出新的例外EmptyVariableError
,並帶有消息"檢測到空變數"
,原始例外通過from
傳遞。
6.3 分析重新包裝的例外
使用raise ... from操作符允許保存例外鏈的資訊,這對於除錯可能很有用。你可以分析重新包裝的例外及其原因。
範例分析重新包裝的例外:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("變數是空的")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("檢測到空變數") from e
運行上述代碼將產生以下輸出:
Traceback (most recent call last):
File "example.py", line 8, in
check_non_empty("")
File "example.py", line 5, in check_non_empty
raise ValueError("變數是空的")
ValueError: 變數是空的
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "example.py", line 10, in
raise EmptyVariableError("檢測到空變數") from e
EmptyVariableError: 檢測到空變數
第一個錯誤(標記為綠色)
是原始錯誤,它在代碼深處某處發生。有時這些錯誤不時會發生,這是程序的正常行為。
第二個錯誤(標記為藍色)
是更高級別的錯誤。你的程序或框架應知道如何處理它。但如果你想深入了解錯誤的原因,綠色的錯誤可以幫助你。
一切都非常合理。
GO TO FULL VERSION