【Kotlin/Android】エラークラスThrowableとExceptionの違いと使い方

この記事からわかること
- Android Studio/Kotlinでエラークラスの違いと使い方
- ThrowableとExceptionとは?
- RuntimeExceptionやErrorとの使い分け
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Kotlinのエラー(例外)クラス
Kotlinで定義されているエラー(例外)に関するクラスは大きく分けてThrowable
、Exception
、Error
の3種類があります。なんだかたくさんあってややこしいですが、Throwable
がKotlin(Java)の全てのエラークラスの基底(スーパー)クラスとなります。
つまり階層構造にすると以下のようにThrowable
のサブクラスとしてException
とError
がありさらにそのサブクラスにさまざまなエラーが定義されています。
├── Throwable
│ ├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── etc...
│ ├── Exception
│ ├── IOException
│ ├── RuntimeException
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ └── etc...
│ └── etc...
Throwableクラス
Throwable
クラスは全てのエラークラスの基底(スーパー)クラスで、message
やstackTrace
などをエラー情報に欠かせないプロパティを保持しています。つまり発生するエラーや例外クラスはThrowable
を継承していることになります。
Throwable
を投げるにはthrow
の後にインスタンス化します。
fun throwsThrowable() {
throw Throwable("エラーが発生しました。")
}
エラーが発生するメソッドはtry〜catch文
で補足することができます。
try {
throwsThrowable()
} catch (t: Throwable) {
Log.d("RxJava", "${t.message}")
}
ExceptionとErrorの違い
Throwableは基底クラスということがわかりましたがそのサブクラスであるException
、Error
の違いはなんでしょうか?リファレンスを見てみると以下のように記述されていました。
Exception(例外):通常のアプリケーションでキャッチされる可能性のある問題
Error(エラー):通常のアプリケーションであればキャッチすべきではない重大な問題
どうやらエラーの重大さが異なるようです。つまりアプリ内でキャッチしてハンドリングするようなエラーはException
、アプリをクラッシュさせるべきような致命的なエラーはError
として定義されている感じですかね。
Exceptionクラス
Exception
はプログラム内でエラーハンドリングを行うような例外を定義するクラスでした。Exception
はさらにRuntimeException
を継承しているものとそうでないものに分かれます。これは「チェック例外」と「非チェック例外」と呼ばれているようです。メソッドにthrows節
がついているものがチェック例外となりtry〜catch文
での補足が必須になり、補足していない場合コンパイルエラーになるようですが、Kotlinではコンパイルエラーにはならないようです。
├── Throwable
│ ├── Exception
│ ├── IOException
│ ├── SQLException
│ ├── ClassNotFoundException
│ ├── RuntimeException
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ └── etc...
│ └── etc...
独自のエラーを定義したい場合はException
クラスを拡張するのが良さそうです。例えば以下のような感じでしょうか?
// APIエラーの基底クラス
open class ApiException(message: String? = null, cause: Throwable? = null) : Exception(message, cause)
// 通信エラー
class NetworkException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
// サーバーエラー
class ServerException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
// 認証エラー
class AuthenticationException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
// その他の予期せぬエラー
class UnexpectedException(message: String? = null, cause: Throwable? = null) : ApiException(message, cause)
Errorクラス
Error
は基本的に致命的なエラーを定義するクラスでした。定義されているものもメモリ消費が激しい場合や呼び出しスタックがオーバーフローした場合などになります。
├── Throwable
│ ├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ ├── AssertionError
│ └── etc...
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。