割と当然だと思ってましたが、社内の若手さんが知らなかったので何かの役に立つかと思いメモ。
try-catchで、エラーごとに処理を分けたい時
あると思うんですよ。そんなときに、catchする順番が重要だったりします。具体的には、
class MyException extends Exception{}
try{
throw new MyException('hoge');
}catch(Exception $e){
var_dump('Exception');
}catch(MyException $e){
var_dump('MyException');
}
こういうコードですね。(言うまでもないですがvar_dumpの部分には本来ログ取ったり処理分けたりしたいコードが入ります)
で、この場合、トップレベルでExceptionを捕まえてしまうと、MyExceptionはExceptionを継承してるから、catch(MyException)
の所で捕まえられません。(必ずcatch(Exception $e)
のブロックに入ってしまうため。)
拡張エラーを使って処理を分けたい場合、継承元のエラーは必ず最後に書かないと駄目、という当たり前の話でした。
ちなみに
Rubyも同じです。
class ExceptionTest
def test
begin
1/0
rescue StandardError => ex
puts "StandardError"
rescue ZeroDivisionError => ex
puts "ZeroDivisionError"
end
end
end
obj = ExceptionTest.new
obj.test # => StandardError
エラーのクラス毎に処理分けたい場合、トップで継承元のエラーを捕まえてはいけない、という話でした。