2016-11-08 9 views
1

私の例では、カスタム例外クラスMyCustomExceptionがあり、メインではaを0に分割してZeroDivisionError例外を発生させます。例外ブロックでは、私はZeroDivisionErrorを捕まえてから、MyCustomExceptionerrに上げます。これにより、チェーンされた例外が発生します。自分自身に加えて、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 

私はそれを実行するときに私が手出力:except句の

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

答えて

3

は同じtryブロック内で例外ハンドラを検索しません(それはそれでは発生しませんでしたtryブロック)。

ハンドラを1レベル上に、つまり外側のtryのブロックを検索します。それが見つからなければ、通常のように実行が中断され(例外が表示されます)。

要するに

、カスタム例外をキャッチするために、適切なexcept MyCustomExceptionと外側のレベルで囲むtryが必要になります。

ZeroDivisionError -- division by zero 
Caught MyException 
を:実行したときに、今プリントアウトし、

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

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

関連する問題