LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

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

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

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

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