入出力・エラーと例外・クラス・標準ライブラリ・対話環境(7,8,9,10,14章)
次のように例外クラスの継承関係が定義されているとき、except節を記述する順序として正しいものはどれか。 class AppError(Exception): pass class ValidationError(AppError): pass
- Aexcept節はクラスの継承関係に関係なく、記述した順序に意味はない
- BAppErrorとValidationErrorは兄弟クラスなので、どちらを先に書いても捕捉される例外は変わらない
- Cexcept AppError: を先に、except ValidationError: を後に書く(この順序ではValidationErrorが送出されても常にAppError側で捕捉される)
- ✓except ValidationError: を先に、except AppError: を後に書く(より限定的な例外クラスを先に判定させる必要があるため)
解説
except節は上から順に評価され、最初にマッチしたものが実行される。ValidationErrorはAppErrorのサブクラスであるため、AppErrorを先に書くとValidationErrorも常にそちらで捕捉されてしまい、後段のexcept ValidationError節に到達しない。したがってより限定的なサブクラスを先に書く必要がある。
根拠8章 エラーと例外(複数のexcept節と例外クラスの階層)