01 / 07
おかしな値でも、進んでしまう
関数に思っていなかった値が渡ってきても、Python はとくに何も言わない。そのまま計算して、そのまま表示してしまうよ。
下の例は年齢に負の数が来ているのに、何も起きずに通ってしまっている。ここで止められないと、ずっと後ろの行で意味の分からない結果になって、原因をたどれなくなるんだ。
def tosi_wo_iu(tosi): print(f"{tosi}さいだよ")tosi_wo_iu(-3)実行結果
-3さいだよ
まちがいと向き合う
INPUT · スライド
01 / 07
関数に思っていなかった値が渡ってきても、Python はとくに何も言わない。そのまま計算して、そのまま表示してしまうよ。
下の例は年齢に負の数が来ているのに、何も起きずに通ってしまっている。ここで止められないと、ずっと後ろの行で意味の分からない結果になって、原因をたどれなくなるんだ。
def tosi_wo_iu(tosi): print(f"{tosi}さいだよ")tosi_wo_iu(-3)実行結果
-3さいだよ
02 / 07
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
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 で「これはおかしい」と声を上げる出す場所と受け止める場所を自分で決められるようになったら、エラーは「出たら終わり」のものではなくなる。どこで気づき、どこで直すかを決める——つまり設計の一部として使えるようになったということだよ。