まちがいと向き合う

INPUT · スライド

エラーで止めない

01 / 07

エラーが出ると、そこで止まる

エラーはこれまで「出たら直すもの」だった。でも、書きまちがい以外の理由で失敗することもある。外から来た数字が数字になっていない、あるはずの項目が無い、といった場合だよ。

エラーが起きると、プログラムはその行で止まる。あとに書いた行はもう動かない。下の例では おわり が出ていないね。

print("はじめ")print(10 / 0)print("おわり")

実行結果

はじめ
ZeroDivisionError: division by zero

02 / 07

try と except で受け止める

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

as でエラーを受け取る

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

else と finally

まとまりはもう2つ足せる。どちらも書かなくていいけれど、読めるようにしておこう。

  • else: … 失敗しなかったときだけ動く。うまくいった場合の続きを書く場所
  • finally: … 成功しても失敗しても最後に必ず動く。後片づけを書く場所

try のまとまりを短く保ちたいときに、else が効いてくるよ。

try:    kazu = int("12")except ValueError:    print("かずにできなかった")else:    print(kazu * 2)finally:    print("はんていおわり")

実行結果

24
はんていおわり

07 / 07

囲むのは、どうするか決められるところだけ

try で囲めばエラーは出なくなる。でも消えたのはエラーであって、問題ではない。except の中で何もしないでおくと、失敗したことに誰も気づけないまま動き続けてしまう。

囲むのは「失敗しうると分かっていて、失敗したときにどうするか決められる」ところだけ。迷ったら、except に書くことを先に考えてみるといいよ。

それじゃあ、受け止める練習をしてみよう。