LoginSignup
36
35

More than 5 years have passed since last update.

例外とエラーの違い

Last updated at Posted at 2018-05-27

> to English Pages

1. 概要

あるプロジェクトでアプリケーションの例外設計について解説してた時、まず「例外とエラーの違い」についてプロジェクトメンバーに説明しなければならない事がありました。
この記事では、その時の説明の概要を投稿します。

2. はじめに

みなさんは、「例外とエラーの違い」について簡単に説明できますか?
つい先日も、あるプロジェクトで

例外とエラーの違いは何か?

という質問を受けました。
この質問は以外に多い。
過去には、システム設計の話の中で、

「想定内が例外」で「想定外がエラー」

と決め込むエンジニアもいました。
それに対して

「目的が達成できれば例外」で「目的が達成できなければエラー」

と反論するエンジニアもいました。
さらに、

「中断処理をしない例外処理は気持ち悪い」

と言い出すプログラマーもいました。
そしてついには、

「例外という本来の言葉の意味とは...云々」

と語りはじめるエンジニアも現れました。
(私も昔は、例外の言葉の意味を考えたことのある一人です・・・)
この「エラーと例外の違いは何か?」の答えは、今どの領域について話をしているか次第です。
それをこれから例示します。

3. 例外とエラー

exception_and_error.png
まず、我々エンジニアが最低限知っておかなければならないのは「例外とエラーの違いが普遍的に成立する概念は存在しない」ということです。
これを理解してないエンジニアさんは割と多い気がします。
したがって、冒頭のような誤解が生じるのだと思います。
要するに「普遍的な概念として両者を明確に定義することは不可能」ということです。
なぜなら、歴史的な背景もあり「例外とエラー」の定義は扱う領域によって異なるからです。
逆に、普遍的でなければ、その領域固有の定義は存在することもあります。
例えば Java は、他の言語に比べかなり明確になっていますが、C++ との差分は大きいです。
もし、特定の領域の「例外とエラー」の仕様に限定して議論してるなら、その領域の仕様に沿えばいいだけです。
もし、定義されてなければ?
定義されてないということは、「定義しない」ということを決めてるか、解釈の余地が残されているということかもしれません。

また、前述の「中断しない例外処理に対する賛否」についてですが、Ruby では、例外機構の中に retry という機構があります。
これは、例外処理中の再試行または復帰を意味します。
例えば、Python では、retry パッケージが配布されています。
Java や C++ では、retry 機構は公式サポートされていません。
でも、私は retry 機構を自前で実装している Java プロジェクトを知っています。
PHP でも goto 機構の制約に従えば、例外処理の再試行または復帰は可能です。
また、Java では、検査例外機構まで備わっています。
このように、ある特定言語の「例外とエラー」の仕様が、他のフィールドへ当てはまるとは限らないということです。

では、より広範囲なシステム設計の領域ではどう考えるべきか?
必要に応じて定義すれば良いのです。
冒頭のアプリケーションの例外設計の話も同じです。

4. まとめ

例外とエラーの違いは、普遍的に成立する概念は存在しません。
例外とエラーの定義は、それぞれのフィールドの定義に過ぎません。
定義があればそれに沿えばいい、なければ必要に応じて定義すればいい。

36
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
35