まちがいと向き合う

INPUT · スライド

自分からエラーを出す

01 / 07

おかしな値でも、進んでしまう

関数に思っていなかった値が渡ってきても、Python はとくに何も言わない。そのまま計算して、そのまま表示してしまうよ。

下の例は年齢に負の数が来ているのに、何も起きずに通ってしまっている。ここで止められないと、ずっと後ろの行で意味の分からない結果になって、原因をたどれなくなるんだ。

def tosi_wo_iu(tosi):    print(f"{tosi}さいだよ")tosi_wo_iu(-3)

実行結果

-3さいだよ

02 / 07

raise で自分から出す

raise のうしろにエラーの種類とメッセージを書くと、その場でエラーを起こせる。raise ValueError("としは0いじょうで") の形だよ。

ValueError は「値がおかしい」という意味の種類。前のグループで読んだ名前が、そのまま自分でも使えるんだ。

raise の行まで来ると、そこから先は動かない。受け止める except が無ければ、そのままプログラムが止まるよ。

def tashikameru(tosi):    if tosi < 0:        raise ValueError("としは0いじょうで")    print(f"{tosi}さい")tashikameru(12)tashikameru(-3)

実行結果

12さい
ValueError: としは0いじょうで

03 / 07

呼び出した側で受け止める

出したエラーは、呼び出した側の try と except で受け止められる。前のレッスンでやったとおりだよ。

as e で受け取って表示すれば、自分で書いた文がそのまま読める。だから読んだ人に伝わる言葉で書いておくと、あとで自分が助かるんだ。

def tashikameru(tosi):    if tosi < 0:        raise ValueError("としは0いじょうで")    print(f"{tosi}さい")try:    tashikameru(-3)except ValueError as e:    print(e)

実行結果

としは0いじょうで

04 / 07

関数の入口ではじく

raise を書く場所は、おかしな値に気づいたところだよ。関数の入口で確かめて、その場ではじいてしまうのがいちばん分かりやすい。

そのまま進めてしまうと、変な値が計算を通り抜けて、ずっと後ろの行で「なぜこの結果になるのか分からない」という形で出てくる。近いところで失敗させれば、原因も近いんだ。

def kau(zaiko, kosuu):    if kosuu > zaiko:        raise ValueError("ざいこがたりない")    print(f"のこり{zaiko - kosuu}こ")try:    kau(5, 9)except ValueError as e:    print(e)

実行結果

ざいこがたりない

05 / 07

assert と raise の使いわけ

2つは似ているけれど、向いている相手がちがう。

  • assert … 自分のまちがいを見つけるしかけ。外れたらプログラムのバグ
  • raise … 外から来た値がおかしいと相手に伝えるもの。受け止めてもらう前提

種類は、すでにあるものから選べばいい。値がおかしいなら ValueError、種類が合わないなら TypeError。自分だけのエラーの種類を作るにはクラスが必要なので、それは先の章のお楽しみだよ。

def waru(a, b):    if b == 0:        raise ValueError("0ではわれない")    return a // btry:    print(waru(10, 2))    print(waru(10, 0))except ValueError as e:    print(e)

実行結果

5
0ではわれない

06 / 07

メッセージは読む人のために

"エラー" とだけ書いてあるメッセージは、あとから読んでも何も分からない。何が、どうだと困るのかを入れておこう。

  • 伝わらない … "だめ"
  • 伝わる … "なまえがからっぽ"

止めるのは意地悪ではなくて、あとで困らないための親切だよ。

07 / 07

エラーは設計の一部になる

ここまでで、エラーとの付きあいかたがひととおりそろった。

  • 読む … 種類とトレースバックから原因を絞る
  • 備える … assert で思いこみを書き残す
  • 逃がす … try と except で落ちずに続ける
  • 伝える … raise で「これはおかしい」と声を上げる

出す場所と受け止める場所を自分で決められるようになったら、エラーは「出たら終わり」のものではなくなる。どこで気づき、どこで直すかを決める——つまり設計の一部として使えるようになったということだよ。