01 / 07
エラーが出ると、そこで止まる
エラーはこれまで「出たら直すもの」だった。でも、書きまちがい以外の理由で失敗することもある。外から来た数字が数字になっていない、あるはずの項目が無い、といった場合だよ。
エラーが起きると、プログラムはその行で止まる。あとに書いた行はもう動かない。下の例では おわり が出ていないね。
print("はじめ")print(10 / 0)print("おわり")実行結果
はじめ ZeroDivisionError: division by zero
まちがいと向き合う
INPUT · スライド
01 / 07
エラーはこれまで「出たら直すもの」だった。でも、書きまちがい以外の理由で失敗することもある。外から来た数字が数字になっていない、あるはずの項目が無い、といった場合だよ。
エラーが起きると、プログラムはその行で止まる。あとに書いた行はもう動かない。下の例では おわり が出ていないね。
print("はじめ")print(10 / 0)print("おわり")実行結果
はじめ ZeroDivisionError: division by zero
02 / 07
try: の下に失敗するかもしれない処理を、except: の下に失敗したときにやることを書く。どちらも字下げしてまとまりを作るよ。
エラーが起きると、その場で止まらずに except のまとまりへ飛ぶ。抜けたあとは、何もなかったように続きが動くんだ。
try: print(10 / 0)except ZeroDivisionError: print("0ではわれない")print("つづきはうごく")実行結果
0ではわれない つづきはうごく
03 / 07
except のうしろに書くのが受け止めるエラーの種類。前のグループで読んだ名前がそのまま使えるよ。
書いた種類だけを受け止めて、それ以外は今までどおり止まる。「これは起きるかもしれない」と分かっているものだけを拾うという書きかただね。
hito = {"namae": "ゆい"}try: print(hito["shumi"])except KeyError: print("そのキーはないよ")実行結果
そのキーはないよ
04 / 07
except ValueError as e: と書くと、起きたエラーそのものが e という名前で受け取れる。
そのまま print すると、Python が用意した説明が読める。画面に出ていた ValueError: のうしろの部分だよ。原因を追いかけたいときの手がかりになるね。
try: kazu = int("さん")except ValueError as e: print("かずにできなかった") print(e)実行結果
かずにできなかった invalid literal for int() with base 10: 'さん'
05 / 07
種類を書かずに except: とだけ書くと、どんなエラーでも受け止めてしまう。楽に見えるけれど、これはやってはいけない書きかただよ。
下の例は変数名を打ちまちがえているだけ。本当なら NameError が出て一発で分かるのに、except: が黙って飲みこんでしまい、「なにかしっぱいした」としか分からなくなる。
受け止めたのは失敗であって、原因ではない。種類を書かないと、直すべき場所が永久に見えなくなるんだ。
nedan = 300try: print(nedann)except: print("なにかしっぱいした")実行結果
なにかしっぱいした
06 / 07
まとまりはもう2つ足せる。どちらも書かなくていいけれど、読めるようにしておこう。
else: … 失敗しなかったときだけ動く。うまくいった場合の続きを書く場所finally: … 成功しても失敗しても最後に必ず動く。後片づけを書く場所try のまとまりを短く保ちたいときに、else が効いてくるよ。
try: kazu = int("12")except ValueError: print("かずにできなかった")else: print(kazu * 2)finally: print("はんていおわり")実行結果
24 はんていおわり
07 / 07
try で囲めばエラーは出なくなる。でも消えたのはエラーであって、問題ではない。except の中で何もしないでおくと、失敗したことに誰も気づけないまま動き続けてしまう。
囲むのは「失敗しうると分かっていて、失敗したときにどうするか決められる」ところだけ。迷ったら、except に書くことを先に考えてみるといいよ。
それじゃあ、受け止める練習をしてみよう。