1. ホーム 
  2. 備忘録 
  3. Python

例外処理

例外処理

Pythonの例外処理は try-except文 を使って行う

例外処理の書き方について以下に記載する

各例外(Exception)の継承関係はこちらを確認すること


### 例外処理の書き方
# インデックスエラーの例
l = [1, 2, 3]
i = 5

try:
    l[i]  # リスト範囲外なのでエラーが出るはず
except:
    # エラーをキャッチしてこちらが出力される
    print("Don't worry")  # Don't worry

# エラーが起きたが例外処理されたので通過できる
print('last')  # last


### もっと細かくエラーハンドリングする
# リストを削除する
del l

try:
    l[i]  # リストは削除されているのでエラーが出るはず
except IndexError as ex:
    print(f"Don't worry: {ex}")
except NameError as ex:
    # 未定義エラーなのでこちらが出力される
    print(ex)  # name 'l' is not defined


### その他のエラーをハンドリングする
# リストとタプルを足し合わせようとする
l = [1, 2, 3]
t = (4, 5, 6)

try:
    l = t + l  # リストとタプルは直接足し算できないのでエラーが出るはず
except IndexError as ex:
    print(f"Don't worry: {ex}")
except NameError as ex:
    print(ex)
except Exception as ex:
    print(f'other:{ex}')  # other:can only concatenate tuple (not "list") to tuple

"""
ただし、Exceptionでどんなエラーかわからないけど
とりあえず全て補足して次の処理に進ませるというのはプログラム的にはNGなので
基本的には各エラー種別ごとに補足して適切な処理をすること
"""

finally文

try-except文 のあと必ず最後に実行したい処理がある場合には finally文 を使用する

こちらはエラーが発生しなかろうと、エラーが発生してハンドリングしようとしなかろうと、必ず最後に実行されるよう強制できる

finally文 の例を以下に記載する


l = [1, 2, 3]
i = 5

# 通常処理
try:
    print(l[0:3])  # [1, 2, 3]
finally:
    print('clean up')  # clean up

# エラーハンドリング有り
try:
    l[i]
except IndexError as ex:
    print(f"Don't worry: {ex}")  # Don't worry: list index out of range
except NameError as ex:
    print(ex)
finally:
    print('clean up')  # clean up

# エラーハンドリング無し
try:
    l[i]  # IndexError: list index out of range
finally:
    print('clean up')  # clean up

else文

try-exception文 で例外を補足できるようにしたあと、例外が発生しなかったときだけ行いたい処理がある場合に else文 が活用できる

この else文 の処理は finally文 よりも前に行われるため、try-exception ブロックを抜けたあと後ろに続く処理とは意味合いが異なる

else文 の書き方を以下に記載する


l = [1, 2, 3]
i = 5

# 通常処理
try:
    print(l[0:3])  # [1, 2, 3]
except IndexError as ex:
    print(f"Don't worry: {ex}")
else:
    print('Done!!')  # Done!!
finally:
    print('clean up')  # clean up

# エラーが起きた場合
try:
    l[i]
except IndexError as ex:
    print(f"Don't worry: {ex}")  # Don't worry: list index out of range
else:
    # ここは出力されない
    print('Done!!')
finally:
    print('clean up')  # clean up