見出し画像

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は終了します。

結局長くかかってしまいましたが、欠かさず続けることが力になりますね。





いいなと思ったら応援しよう!