Pythonでエラーが発生するとプログラムの実行が止まってしまいます。
しかし、例外処理を入れていれば止まらずに実行し続けることができます。
この記事では例外処理について記載します。
エラー
PythonのエラーであるNameErrorとZeroDivisionErrorの例です。
print(a + 2) # NameError: name 'a' is not defined # 変数aは定義されていないので、NameErrorとなる。
for i in [5, 2, 0]: print(10 / i) # 2.0 # 5.0 # ZeroDivisionError: division by zero
プログラム内で除算を使用していると、通常発生しなくても不意にZeroDivisionErrorが発生することはあり得ます。
それに備えて例外処理は実装しておく必要があります。
発生しうるエラーのバリエーションは仕様書をご覧ください。
例外処理
シンプルな例外処理はこうです。
try節でエラーが発生しても、except節側を通り、プログラムは止まることなく動き続けます。
try: print(10 / 0) except: print('例外が発生しました。') # 例外が発生しました。
except節
exceptキーワードの後ろに処理したいエラーを指定することができます。
try: print(10 / 0) except NameError: print('NameErrorが発生しました。') except ZeroDivisionError: print('ZeroDivisionErrorが発生しました。') # ZeroDivisionErrorが発生しました。
発生したエラーがexcept節で処理されない場合、エラーになりプログラムが止まってしまいます。
try: print(10 / 0) except NameError: print('NameErrorが発生しました。') except TypeError: print('TypeErrorが発生しました。') # ZeroDivisionError: division by zero
例外処理は以下のように漏れなく実装しましょう。
try: print(10 / 0) except NameError: print('NameErrorが発生しました。') except TypeError: print('TypeErrorが発生しました。') except: print('例外が発生しました。') # 例外が発生しました。
else節
try-except文にはelse節を付けることができます。
else節は、try節で例外が発生しなかったときに実行されます。
try: a = 10 / 2 except ZeroDivisionError: print('ZeroDivisionErrorが発生しました。') except: print('例外が発生しました。') else: print('例外が発生しませんでした。') print('a = ', a) # 例外が発生しませんでした。 # a = 5.0
エラー内容を見る
except節は例外名の後に変数を指定できます。
下のサンプルコードではerr変数のことです。
その変数は例外インスタンスに紐付けられ、引数を表示できます。
try: import aaa except ModuleNotFoundError as err: print(type(err)) print(err) print(err.name) # <class 'ModuleNotFoundError'> # No module named 'aaa' # aaa
例外を発生させる
例えば、開発段階で未実装部分が実行された場合にアラートを出したいことがあります。
未実装部分にNotImplementedError例外を発生させるようにすることもできます。
raise NotImplementedError