Posted at

try/catch か throws Exception か

More than 3 years have passed since last update.

Javaで例外が起きうるコードを書いていると、あるIDEが try/catch をつけるか、thorws Exception をつけるかをサジェストしてきた.

それぞれが何を意味していて、いかに使い分ければ良いか.


サンプルコード

try/catch

public void someMethod() {

try {
// do something which might fail.
} catch (Exception e) {
// handle the failure.
}
}

throws Exception

public void someMethod() throws Exception {

// do something which might fail.
}


ハンドルするか/エラーを投げるか

2つの方法には大きな違いがある.


try/catch: エラーを飲み込む.

catch内部でrethorwしないとすると、メソッドのtry内部でエラーが発生したとしても、呼び出し元はそのエラーを見ない. そのため、メソッド内部で完璧にエラーを飲み込んでハンドルし、メソッドの目的(呼び出し元が期待する戻り値や処理)を果たすことに気をつける必要がある.

特定のエラー後に行いたい処理がある場合、try/catchを使うと書けそう.


throws: エラーを呼び出し元に伝える.

throw を使っているメソッド内部で、エラーが発生した場合は、そのメソッドの呼び出し元がエラーをハンドルする必要がある.

メソッド宣言において、こういうエラーを投げうるということを宣言する意味がある.(そうすることで、呼び出し元にエラーハンドリングが推奨される.)


Rubyで言うと、throwsはデフォルトで、try/catchbegin/rescue に対応するのかなと思った.