個別の例外としてではなく、その上位例外である Exception
を catch
することで全ての例外を捕捉することができます。
int foo(int value) throws Exception
{
try {
int ans = 100/value; ← @ value が 0 のとき ArithmeticException が発生する。
return ans;
} catch (Exception e) { ← A ArithmeticException も Exception で捕捉できる。
throw e;
}
}
上述のように Exception
として捕捉され再度投げられても、元々の例外として捕捉できます。
int foo(int value) throws Exception ← Exception を投げると宣言
{
try {
int ans = 100/value; ← @ value が 0 のとき ArithmeticException が発生する。
return ans;
} catch (Exception e) { ← A Exception として捕捉する。
throw e; ← B そのまま投げる。
}
}
int bar(int value) throws ArithmeticException
{
try {
int ans = foo(value); ← C value が 0 のとき例外が発生する。
return ans;
} catch (ArithmeticException e) { ← D AritmeticException として捕捉できる。
throw e;
}
}
例外を捕捉(catch
)しなかったら、処理はそこで打ち切られ、そのまま呼び元に例外が伝えられます。
int foo(int value) throws Exception
{
try {
int ans = 100/value; ← @ value が 0 のとき ArithmeticException が発生する。
return ans;
} catch (Exception e) { ← A Exception として捕捉する。
throw e; ← B そのまま投げる。
}
}
int bar(int value) throws Exception ← このメソッドでは例外を捕捉しない。
{
int ans = foo(value); ← C value が 0 のとき例外が発生する。
return ans; ← D このステップは実行されない。
}
int hoge(int value) throws Exception
{
try {
int ans = bar(value); ← E value が 0 のとき例外が発生する。
return ans;
} catch (Exception e) { ← F bar() 内で発生した例外は捕捉できる。
throw e;
}
}
例外を捕捉(chatch
)したら、その例外は無くなります。
その例外をさらに呼び元に伝えたい場合は、投げ直さなければなりません。
int bar(int value) throws Exception
{
try {
int ans = foo(value); ← @ ここで何らかの例外が発生したとする。
return ans;
} catch (ArithmeticException e) { ← A ArithmeticException の場合は
return -1; ← B -1 を返し、それ以上例外とはしない。
} catch (Exception e) { ← C その他の例外の場合は
throw e; ← D そのまま投げる。
}
}