KDOC 205: エラーと例外の違い
この文書のステータス
- 作成
- 2024-08-10 貴島
- レビュー
- 2024-08-11 貴島
概要
同僚との会話でエラーと例外は違う、という話が出た。違いを知らなかったので、調べた。
Wikipediaに、ちょうど説明している項目がある。
例外(exception)はシステム担当者が問題解決を行う必要がある。例外の問題解決手段には例外を無視することも含まれるが、明確な根拠をもって無視する必要がある(設計の一環として一部の例外を無視しても問題ないと判断する,連携する他システムのメンテナンス中で例外発生が不可避な場合はメンテナンス完了を待つ)。例外に対して、ユーザーが解決すべき問題はエラー(error)と呼ぶ(但し、業務システム開発ではエラーを業務エラー、例外をシステムエラーと表現する場合もあり、技術者間での厳密な統一見解は存在しない)[1][2][3]。何らかのシステム開発を行う会社では、例外への対処が不適切であるとユーザーに損害を与えるため、システム障害を発生させるような例外発生は製品の瑕疵として扱う必要がある。 例外処理 - Wikipedia
わかったようなわからないような、という感じ。
Javaでいう例外とエラーは、また意味が異なるように見える。
最初に、エラー。
ErrorはThrowableのサブクラスで、通常のアプリケーションであればキャッチ(cache)すべきではない重大な問題を示します。そうしたエラーの大部分は異常な状態です。
java.lang.Object java.lang.Throwable java.lang.Error
たとえば、VirtualMachineErrorがある。Java仮想マシンが壊れているか、または動作を継続するのに必要なリソースが足りなくなったことを示す、という。たしかに重大な問題で、プログラムでキャッチしてもどうしようもなさそうだ。
つぎに、例外。
Exceptionクラスとそのサブクラスは、通常のアプリケーションでキャッチされる可能性のある状態を示すThrowableの形式の1つです。
java.lang.Object java.lang.Throwable java.lang.Exception
たとえばNullPointerExceptionがある。オブジェクトが必要な場合に、アプリケーションがnullを使おうとするとスローされる、という。
java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.NullPointerException
「エラー」に比べて、キャッチする余地があるのを感じる。
Javaでいうとそういう定義、というだけで、日常使っている「エラー」というともっと広い意味で、回復不能かどうかのニュアンスはないように見える。プログラムの実行が停止して目的を達成せず、何か文言が出ていたら「エラーだ」、という感じでつかっている。
関連
なし。