例外処理(エラーハンドリング)

投稿者: | 2022-10-28

目次

例外処理

l = [1,2,3]
i = 5
l[i]
l = [1,2,3]
i = 5
try:
    l[i]
except:
    print("リストに含まれない文字を出力しようとしてます")

# リストに含まれない文字を出力しようとしてます
  • exceptの後にエラーの種類を書き、特定のエラーが発生した場合のみ、処理を実行することも可能

l = [1,2,3]
i = 5
try:
    l[i]
except IndexError:
    print("リストに含まれない文字を出力しようとしてます")
  • except エラー種類 as 変数 とすれば、エラーの内容を表示できる
l = [1,2,3]
i = 5
try:
    l[i]
except IndexError as ex:
    print("Don't worry: {}".format(ex))

# Don't worry: list index out of range
  • IndexErrorのみエラーハンドリングしていると、他のエラーでは例外処理がなされない
l = [1,2,3]
i = 5
del l
try:
    l[i]
except IndexError as ex:
    print("Don't worry: {}".format(ex))
  • この場合、NameErrorの例外処理を追記する
l = [1,2,3]
i = 5
del l
try:
    l[i]
except IndexError as ex:
    print("Don't worry: {}".format(ex))
except NameError as ex:
    print(ex)

# name 'l' is not defined
  • IndexErrorでもNameErrorでもないエラーが発生したときは
  • except Exceptionと書きます。ただしこの書き方はあまり推奨されない
l = [1,2,3]
i = 5

try:
    () + l
except IndexError as ex:
    print("Don't worry: {}".format(ex))
except NameError as ex:
    print(ex)
except Exception as ex:
    print("other:{}".format(ex))

# other:can only concatenate tuple (not "list") to tuple

エラーの階層

https://docs.python.org/ja/3/library/exceptions.html#exception-hierarchy

  • 一番上に BaseException がある。どんなエラーが発生するかわからない場合は、上位階層の Exception を処理するようにすると、意図しないエラーもキャッチして処理できる
  • ただし、Pythonの書き方として、よくわからないエラーもすべてキャッチして次のコードに進むという処理はあまり推奨されない。

finally

  • finallyと書くと、最後に必ず実行する処理を書くことが出来る
l = [1,2,3]
i = 5
del l
try:
    l[i]
except IndexError as ex:
    print("Don't worry: {}".format(ex))
except NameError as ex:
    print(ex)
finally:
    print('clean up')

# name 'l' is not defined
# clean up
  • エラーが処理されずプログラムが中断した場合でも、finallyの処理は実行される
l = [1,2,3]
i = 5
try:
    l[i]
finally:
    print('clean up')

else

  • エラー発生しなかったときのみ実行される処理になる
  • finallyの処理は、elseの後に実行される
l = [1,2,3]
i = 5

try:
    l[0]
except IndexError as ex:
    print("Don't worry: {}".format(ex))
except NameError as ex:
    print(ex)
else:
    print('done')
finally:
    print('clean up')

# done
# clean up