1. 概要
あるプロジェクトでアプリケーションの例外設計について解説してた時、まず「例外とエラーの違い」についてプロジェクトメンバーに説明しなければならない事がありました。
この記事では、その時の説明の概要を投稿します。
2. はじめに
みなさんは、「例外とエラーの違い」について簡単に説明できますか?
つい先日も、あるプロジェクトで
例外とエラーの違いは何か?
という質問を受けました。
この質問は以外に多い。
過去には、システム設計の話の中で、
「想定内が例外」で「想定外がエラー」
と決め込むエンジニアもいました。
それに対して
「目的が達成できれば例外」で「目的が達成できなければエラー」
と反論するエンジニアもいました。
さらに、
「中断処理をしない例外処理は気持ち悪い」
と言い出すプログラマーもいました。
そしてついには、
「例外という本来の言葉の意味とは...云々」
と語りはじめるエンジニアも現れました。
(私も昔は、例外の言葉の意味を考えたことのある一人です・・・)
この「エラーと例外の違いは何か?」の答えは、今どの領域について話をしているか次第です。
それをこれから例示します。
3. 例外とエラー
まず、我々エンジニアが最低限知っておかなければならないのは「例外とエラーの違いが普遍的に成立する概念は存在しない」ということです。
これを理解してないエンジニアさんは割と多い気がします。
したがって、冒頭のような誤解が生じるのだと思います。
要するに「普遍的な概念として両者を明確に定義することは不可能」ということです。
なぜなら、歴史的な背景もあり「例外とエラー」の定義は扱う領域によって異なるからです。
逆に、普遍的でなければ、その領域固有の定義は存在することもあります。
例えば Java は、他の言語に比べかなり明確になっていますが、C++ との差分は大きいです。
もし、特定の領域の「例外とエラー」の仕様に限定して議論してるなら、その領域の仕様に沿えばいいだけです。
もし、定義されてなければ?
定義されてないということは、「定義しない」ということを決めてるか、解釈の余地が残されているということかもしれません。
また、前述の「中断しない例外処理に対する賛否」についてですが、Ruby では、例外機構の中に retry という機構があります。
これは、例外処理中の再試行または復帰を意味します。
例えば、Python では、retry パッケージが配布されています。
Java や C++ では、retry 機構は公式サポートされていません。
でも、私は retry 機構を自前で実装している Java プロジェクトを知っています。
PHP でも goto 機構の制約に従えば、例外処理の再試行または復帰は可能です。
また、Java では、検査例外機構まで備わっています。
このように、ある特定言語の「例外とエラー」の仕様が、他のフィールドへ当てはまるとは限らないということです。
では、より広範囲なシステム設計の領域ではどう考えるべきか?
必要に応じて定義すれば良いのです。
冒頭のアプリケーションの例外設計の話も同じです。
4. まとめ
例外とエラーの違いは、普遍的に成立する概念は存在しません。
例外とエラーの定義は、それぞれのフィールドの定義に過ぎません。
定義があればそれに沿えばいい、なければ必要に応じて定義すればいい。