2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Error と Exception の違い、知ってますか?

Last updated at Posted at 2024-12-04

はじめに

記事を見てくださりありがとうございます!
@HayatoHanaoka と申します。
今回はErrorExceptionについて新しい学びがありました。
javakotlinといったjvm系言語をメインで扱っている人からすると、「当たり前の内容じゃん?」と思うかもしれません。
ただ、筆者は今回のプロジェクトで初めてjvm系言語を扱ったので、新しい学びでした。
備忘録がてら残そうと思います。

何があったのか?

以下のコードを見た社内のとあるエンジニアの方から、とあるご指摘をいただきました。

example.kt
class ExampleUseCase(private val examplePort: ExamplePort) {
    fun example(resouceId: ResourceId): Resource {
        // リソースを取得しにいき、なければエラーとする
        val result = examplePort.getResource(resourceId) ?: throw Error("Couldn't get resource")
        return Resource(result)
    }
}

👨 「どうしてエラーを投げてるの?」
👨 「ここで起こるのは、リソースが取れなかった という 例外 だよね」

これを聞いた時、恥ずかしながら「え?何が違うんだ...?」となってしまいました。
皆さんはこの違いを認識できますか...?

何がよくなかったのか?

jvm系の言語は、以下の階層構造でthrowableを持っています。

image.png
引用元:

この違いを全く認識しておらず、今回は処理上発生するエラーに Error を割り当ててしまっていたのがよくなかったのですね。

どう修正するのが適切か?

これを踏まえてコードを修正すると、以下のようになります。

class ExampleUseCase(private val examplePort: ExamplePort) {
    fun example(resourceId: ResourceId): : Resource {
        // リソースを取得しにいき、なければエラーとする
-         val result = examplePort.getResource(resourceId) ?: throw Error("Couldn't get resource")
+         val result = examplePort.getResource(resourceId) ?: throw IllegalArgumentException("IllegalArgumentException: $resourceId is illegal")
        return Resource(result)
    }
}

最後に

適切なエラーや例外をハンドリングして返すことは意外と難しい。
エラーハンドリングの際は、公式Docs等でエラーの種類などを事前に調査して、適切に扱えるよう注意しようと思います。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?