拋出例外

Python SELF TW
等級 18 , 課堂 0
開放

6.1 故意拋出例外

在 Python 中你可以使用raise操作符故意拋出例外。這可以讓你在程序中標示出錯誤或不合適的情況。讓我們來看看使用raise操作符和重新包裝例外的不同方法。

拋出標準例外

此操作的常用語法如下:


raise exception

你可以通過傳遞相應的信息來拋出標準例外,例如ExceptionTypeError等。

範例: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: 檢測到空變數

第一個錯誤(標記為綠色) 是原始錯誤,它在代碼深處某處發生。有時這些錯誤不時會發生,這是程序的正常行為。

第二個錯誤(標記為藍色) 是更高級別的錯誤。你的程序或框架應知道如何處理它。但如果你想深入了解錯誤的原因,綠色的錯誤可以幫助你。

一切都非常合理。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION