Python資格取得への道のり 11日目
・例外処理(エラーハンドリング)
あえてエラーを出力し、処理を行います。
l = [1, 2, 3]
i = 5
l[i]
#IndexError: list index out of range
l[5]はないので「IndexError」が返ってきます。
しかし下記の内容ですとエラーを返さず、最終行のprintをしっかりと出力する。
l = [1, 2, 3]
i = 5
try:
l[i]
except:
print("Don't worry.")
print("last")
#Don't worry.
#last
これはeccept文があるため。
つまりtry文の中身がエラーとなった場合、except文の中身を実行することができます。そのためエラーは返されず、最終行のprint文も実行される。
l = [1, 2, 3]
i = 5
try:
l[i]
except IndexError as ex:
print("Don't worry: {}".format(ex))
print("last")
#Don't worry: list index out of range
#last
「except IndexError as ex:」にてIndexErrorの際はそのあとを実行することを定義し、さらに「ex」よりIndexErrorの中身を出力しようとしています。
l = [1, 2, 3]
i = 5
del l
l[i]
#NameError: name 'l' is not defined
上記のエラーはNameErrorのため、「except IndexError as ex:」は該当しないこととなります。
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)
print("last")
#name 'l' is not defined
#last
新たにNameError用の分岐を用意しました。
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))
print("last")
#other:can only concatenate tuple (not "list") to tuple
#last
このようにどのエラーにも属さないものに関して「except Exception as ex:」で集約して、その結果を出力している。
しかし、あまりこの表現はエラーを特定しておらず好ましくないコードとなる
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))
finally:
print('clean up')
#other:can only concatenate tuple (not "list") to tuple
#clean up
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)
except Exception as ex:
print('other:{}'.format(ex))
finally:
print('clean up')
#clean up
このようにfinallyで定義したprint文はエラーの有無に関わらず必ず実行されます。
l = [1, 2, 3]
i = 5
try:
l[i]
#except IndexError as ex:
# print("Don't worry: {}".format(ex))
#except NameError as ex:
# print(ex)
#except Exception as ex:
# print('other:{}'.format(ex))
finally:
print('clean up')
#clean up
#エラー
何が起きても必ず実行したい場合は、finally文を使用する。
l = [1, 2, 3]
i = 5
try:
l[i]
except IndexError as ex:
print("Don't worry: {}".format(ex))
except NameError as ex:
print(ex)
except Exception as ex:
print('other:{}'.format(ex))
else:
print('done')
finally:
print('clean up')
#Don't worry: list index out of range
#clean up
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)
except Exception as ex:
print('other:{}'.format(ex))
else:
print('done')
finally:
print('clean up')
#done
#clean up
try 条件式の定義
else文に関しては、成功した時のみ実行する文となる。
except文はエラーの時の処理を行う。(各エラーで対応を変えることも可)
else文は成功時の処理を行う。
finally文はエラーや成功に限らず、必ず実行したい処理を行う。
今日はここまで。
明日でセクション5は終了します。
結局長くかかってしまいましたが、欠かさず続けることが力になりますね。