例外の階層
このレッスンでできるようになること。例外どうしの親子関係を読み取り、家計簿の入力チェックで捕まえる例外をできるだけ狭く書けるようになります。
Python の例外はすべてクラスで、たどっていくと Exception にたどり着きます。文字列を数値に変えられないときの ValueError、型が噛み合わないときの TypeError、0 で割ったときの ZeroDivisionError は、どれも Exception の子孫です。この上下関係を例外の階層と呼びます。
階層を知っていると except の書き方が変わります。except Exception: と書けばあらゆる異常を受け止められますが、想定していなかったバグまで一緒に握りつぶしてしまい、あとから原因を追えなくなります。
try:
amount = int("やすい")
except ValueError:
print("金額として読めません")except の節は上から順に照らし合わされ、最初に当てはまったものだけが動きます。ですから狭い例外を先に、広い例外を後ろに並べます。逆に並べると広いほうが先に当たってしまい、狭い節は永遠に出番がありません。
家計簿の金額欄では「文字が混ざっていた」と「そもそも値が入っていない」を区別したい場面がよく出てきます。前者は ValueError、後者は TypeError として届くので、書き分けておくと利用者に返すメッセージも親切になります。
要件
- 整数に直せたときはその整数を返す
- 数値として読めないときは 金額として読めません を返す
- それ以外の例外のときは そのほかのエラーです を返す
- 例外を関数の外に投げっぱなしにしない
入出力例
read_amount("1200") → 1200
read_amount("やすい") → "金額として読めません"
read_amount(null) → "そのほかのエラーです"ヒント
編集 LuaGate編集部