Pythonのエラーと例外処理

Pythonでエラーが発生するとプログラムの実行が止まってしまいます。
しかし、例外処理を入れていれば止まらずに実行し続けることができます。

この記事では例外処理について記載します。

エラー

PythonのエラーであるNameErrorZeroDivisionErrorの例です。

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