例外
例外(Exception)
プログラムの実行中に発生する、正常ではない何らかの事象を「例外」と呼ぶ。
例
数値を0で割る
例外が起きた時は、基本的にはそれをプログラム的に何とかしなければならない。その処理を「例外処理」と呼ぶ。
エラーと例外の区別
明確な区別はない。
何が例外かは、アプリケーションの設計に依存する。
数学的、論理的不整合以外は、論理的に導き出されるものではない。どう定義するかに依存する。
基本的には、例外を条件判断の材料にしてはならない。
入力ミスによるエラーは業務例外である。
業務例外とシステム例外は明確に分ける必要がある。
判断基準
業務の利用者が業務の範囲で対処可能かどうか。
単純な入出力だけを扱う言語では、出力値の一部をエラー用に割り当てることがある。
例えば、負の値をエラーとするなど。
また、エラーを条件判断だけで扱うと、コードの大半がエラー処理だらけになって、見通しが悪くなる。
関数が多段に適用されている時に、上位関数まで伝搬させるのが難しい。
これに対して、エラーを取り扱うのに、専用の機構を用意するのが例外機構である。
エラーと例外は何が違う?
例外は、何か通常とは異なる特別なことが起きたことを示し、必ずしもエラーではない。
出力でエラー情報を含むタプルを返す方法(関数型言語ではとても正しい)
例外をブロックスコープ内での監視と特定ブロックへのジャンプとして取り扱う方法 (throw 文と、try-catch文)
長所
出力値にエラー値が混ざらない。
コードは正常系をそのまま書けばよい。異常系は異常系でまとめておける。
短所
例外機構を知らないと、何が起こるのか分からない。(コードだけでは読み取れない。)
例外は設計がとても難しい。
そもそも何が起きるのかが分からない。
人間は正常系を考えることは簡単にできるけど、異常系を考えることはほとんどない。異常事態に陥ってようやく気が付く。