Ruby
PHP

PHPのtry-catchで拡張エラーを捕まえたい時の注意点

割と当然だと思ってましたが、社内の若手さんが知らなかったので何かの役に立つかと思いメモ。


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

エラーのクラス毎に処理分けたい場合、トップで継承元のエラーを捕まえてはいけない、という話でした。