7-2. Python 例外の送出 raise


1. Pythonの例外の送出とは?

例外が発生した場合に、呼び出し元に「例外が発生したよ!」ということを知らせて、例外オブジェクトを送出することができます。

例えば、処理 A が処理 B を呼び出して、処理 B の中で例外が発生した場合を考えます。例外が発生したら、処理 B から処理 A に例外を送出することで、処理 A の中で、処理 B で例外が発生したことを知る事ができます。

Pythonの例外送出のイメージ

2. 例外送出の書き方

例外を送出するには、raise 例外クラス か、 raise 例外インスタンス とする必要があります。

クラスについては、この後の章で説明しますが、例外型か、例外型に () 括弧をつけたものを raise の後に指定する必要があると覚えておきましょう。

try:
    例外が発生する可能性のある処理
except 例外型:
    raise 例外インスタンス

例えば、10を0で割った時の例外を、メッセージ付きで送出するには以下のようにメッセージの文字列を指定して書きます。

try:
    10 / 0
except ZeroDivisionError:
    raise ZeroDivisionError('ゼロ割が発生')

送出されたエラーは、呼び出し元で try – except によって捕捉することができます。func() は、処理のまとまりを定義する関数というものです。関数に関する説明は、後の章で説明しますが、以下の例では、func() の中でエラーが発生し、それを呼び出している行にたいして、 try -except で例外を捕捉しています。

def func():
    try:
        10 / 0
    except ZeroDivisionError:
        raise ZeroDivisionError('ゼロ割が発生')


try:
    func()
except Exception as e:
    print(e)

3. 例外のチェーン

例外処理であるexcept節の中で、さらに例外が発生した場合を考えます。
その場合、捕捉した例外オブジェクトをeの変数に代入したとして、 元々の例外オブジェクトはe.__context__ に格納されます。

例えば、10を0で割った時の例外処理 except 節のなかで、未定義の変数にアクセスする例外が発生したとします。0で割った例外ブジェクトはe.__context__に格納されていて、未定義の変数へのアクセス例外はeに格納されています。

try:
    10 / 0
except ZeroDivisionError as e:
    try:
        print(x)
    except NameError as e:
        print(f'元々の例外: {e.__context__}')
        print(f'例外処理の中の例外: {e}')

>> 元々の例外: division by zero
>> 例外処理の中の例外: name 'x' is not defined

4. Python公式ドキュメント


このエントリーをはてなブックマークに追加