2016-11-08 65 views
1

在我的示例中,我有一個自定義的異常類MyCustomException,並且在主體中,我將整數a除以零,這會引發ZeroDivisionError異常。除了區塊外,我抓到ZeroDivisionError,然後從err增加MyCustomException;這會產生一個鏈式異常,我自己的,加上err中的一個。如何處理除了塊之外的異常鏈接

現在我該如何捕獲鏈式異常或鏈式異常如何工作? Python不會讓我在我的代碼中使用except塊來捕獲MyCustomException塊。

class MyCustomException(Exception): 
    pass 

a=10 
b=0 
reuslt=None 

try: 
    result=a/b 

except ZeroDivisionError as err: 
    print("ZeroDivisionError -- ",err) 
    raise MyCustomException from err 

except MyCustomException as e: 
     print("MyException",e)     # unable to catch MyCustomException 

我得到的輸出,當我執行它:

ZeroDivisionError -- division by zero 
Traceback (most recent call last): 
    File "python", line 13, in <module> 
MyCustomException 

回答

3

except子句中使用raise不會搜索在同try塊異常處理(它沒有發生在try)。

它將搜索處理程序的上一層,即外部try塊。如果沒有找到它,它會像通常一樣中斷執行(導致顯示異常)。

總之,你需要一個在外部級與適當except MyCustomException爲了封閉try能吸引您的自定義異常:

try: 
    try: 
     result=a/b 
    except ZeroDivisionError as err: 
     print("ZeroDivisionError -- ",err) 
     raise MyCustomException from err 

except MyCustomException as e: 
    print("Caught MyException", e) 

在執行時,現在打印出:

ZeroDivisionError -- division by zero 
Caught MyException