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