raiseで例外を投げる
このレッスンでできるようになること。raise を使って自分から異常を通知し、家計簿にマイナスの金額が紛れ込むのを止められるようになります。
これまでの例外は Python が勝手に起こすものでした。raise を使うと、自分のコードから例外を起こせます。書き方は raise 例外クラス("メッセージ") です。
def validate_amount(amount):
if amount < 0:
raise ValueError("金額はマイナスにできません")
return amountなぜ return "エラー" ではなく raise なのでしょうか。戻り値でエラーを表すと、呼び出した側が確かめるのを忘れたときに、そのまま先へ進んでしまいます。raise なら止まるので、見落としが起きません。異常は静かに素通りするより、はっきり止まるほうが安全です。
投げた例外は、どこかで受け止めないとプログラムごと落ちます。検証する関数は投げるだけにして、受け止めるのは呼び出し側の役目にします。こうすると「どこで異常を見つけたか」と「どう扱うか」を分けて書けます。
try:
validate_amount(-80)
except ValueError as e:
print("登録できません", e)as e と書くと、投げるときに渡したメッセージを str(e) で取り出せます。利用者に見せる文言は自分で決めた文字列にしておくと、Python の版が変わっても表示がぶれません。
要件
- validate_amount は amount がマイナスなら ValueError を投げる
- 投げるときのメッセージは 金額はマイナスにできません にする
- register は正常なら 品名 を 金額 円で登録しました を返す
- register は例外を受け止めて 登録できません メッセージ を返す
入出力例
register("ノート", 250) → "ノート を 250 円で登録しました"
register("返金", -80) → "登録できません 金額はマイナスにできません"
register("牛乳", 0) → "牛乳 を 0 円で登録しました"ヒント
編集 LuaGate編集部