Python逆引き:例外処理をしたい(Exceptionを何とかしたい)

備忘録ヘッダ画像 逆引きソースコード

C#とかJavaでいうところのtry~catchに相当する処理をPythonで行いたい場合は、try, except ブロックを使用する。

シンプルなコード例

raiseで強制的にValueError例外を発生させる関数を用意し、except ブロックでは例外基底クラスのExceptionで例外をキャッチするようにした例。

def some_function_that_might_fail():
    raise ValueError("error!")

try:
    # 例外が発生する可能性のあるコード
    result = some_function_that_might_fail()
except Exception as e:
    # SomeSpecificException が発生した場合の処理
    print(f"An error occurred: {e}")
実行結果

例外をキャッチして以下の標準出力がなされる。ここでeには発生した例外オブジェクトが入る。

An error occurred: error!

ちゃんと書く場合の例

シンプルなコード例では例外の種類など考慮せずすべての例外をひっかけるように書いたのみで乱暴だが、実際には例外の種類に応じて後処理を分ける必要があることも多い。
そういう時は例外の種類毎にexceptブロックを用意してやる。
また、try, exceptブロック以外にelseブロックとfinallyブロックを以下の例では追加している。

def some_function_that_might_fail():
    raise ValueError("error!")

try:
    # 例外が発生する可能性のあるコード
    result = some_function_that_might_fail()
except SomeSpecificException as e:
    # SomeSpecificException が発生した場合の処理
    print(f"An error occurred: {e}")
except AnotherException as ae:
    # AnotherException が発生した場合の処理
    print(f"Another error occurred: {ae}")
else:
    # 例外が発生しなかった場合の処理
    print("Everything is fine.")
finally:
    # 例外の有無にかかわらず、最終的に実行される処理
    print("This will be executed no matter what.")
何がちゃんとしてるか

この構造では、tryブロック内のコードが実行され、もし何らかの例外が発生した場合それに応じて適切なexceptブロックが実行される。
elseブロックは例外が発生しなかった場合に実行され、finallyブロックは例外の有無にかかわらず最終的に実行されるため、それぞれのケースに応じた適切な後処理を行える。
SomeSpecificExceptionとかの例外クラス部分は実際に存在する例外クラスに置き換えること。

めっちゃ雑に書く時

以下のようにexcept句で特定の例外を指定しない形でも動作する。例外オブジェクトなど不要な強者はこれ。

try:
    # 例外が発生する可能性のあるコード
    result = some_function_that_might_fail()
except:
    # SomeSpecificException が発生した場合の処理
    print("An error occurred")

ちなみに

Exceptionクラスはpython.orgのExceptionについてのページの内容を引用すると。

システム終了以外の全ての組み込み例外はこのクラスから派生しています。

https://docs.python.org/ja/3/library/exceptions.html#Exception

というものらしい。自作の例外クラスを作りたいときはこいつか、こいつのサブクラスから派生させることが推奨されている。

タイトルとURLをコピーしました