こんにちは、saikiです。
開発中、独自にExceptionを定義したいパターンはよくあると思いますが、その時にExceptoionとThrowableどっちを継承するのが正しいのか考える機会があったのでメモっておきます。
独自にExceptionを定義って言ってる時点でExceptionだろって気がしてきましたが実際どうなんでしょうか!お楽しみに!!
目次
Q.アプリ内で定義する独自Exception。継承するならException・Throwableどっち???#
アプリ内のエラーをいい感じにハンドリングするためにこういう奴を定義するとします。
sealed class MyException(message: String) : Exception(message) {
object InvalidUser : MyException("不正なユーザーです")
class InvalidOperation(operation: String) : MyException("不正な操作です:$operation")
}
今Exceptionになっている部分がThrowableでもかけますし基本的に動作は同じなんですがどっちの方が正しいんでしょうかという話です。
余談ですがSealdクラスって便利ですよね。
A.Exceptionであるべき#
どっちがいいとかではなくExceptionじゃないとダメ、と言えそうです。
なんで?#
Exceptionを独自にカスタマイズしたものを定義したいんだから普通に考えたらそうだよなあという感じでもあるんですが、一応説明するのであれば
Throwableはその名の通り「Throwすることができる」だけであり例外的な状況を表すわけではなく、例外を表すのは二つのサブクラス、ErrorとExceptionであるから。
といったところでしょうか。
ついでに、Errorはキャッチすべきではない重大な問題を表し、Exceptionはキャッチされる可能性のある問題を表すそうです。
おまけ:ExceptionとRuntimeException#
Exceptionはアプリケーションの一般的な例外、RuntimeExceptionはコンパイル時に検出できないコーディング上の例外を表すそうです。
結構なんとなくで使い分けてた。
参考#
このページがシンプルでわかりやすく
このページがとても詳しいです
終わりです。
普段気にしていないことでも調べてみると意外と発見があるものですね。
ではまた。