LoginSignup
1
1

More than 3 years have passed since last update.

PHPのtry ~ catchで、Fatalエラーをcatchしたい場合は、ExceptionでなくThrowableを利用する

Last updated at Posted at 2020-07-23

環境

PHP 7.4.0 CLI

Throwableは、PHP5系では利用できないとのこと

発生した問題

稼働しているアプリのログにたまにFatalエラーが記録されている。
原因を探るため、Fatalエラーが発生した場合にtry~catchでデバッグ用の処理を実行し、怪しい変数をvar_dump()してエラーログに吐きたい。
try~catchでエラーハンドリングするようにしたが、以前同じFatalエラーが出力され、エラーハンドリングできていないようにみえる。

解決策

\Exceptionではなく、\Throwableを利用する。
https://stackoverflow.com/questions/12928487/php-try-catch-and-fatal-error
https://www.php.net/manual/en/class.throwable.php

エラーは基本的に握りつぶさず、修正すべき

Exception、Fatalエラーを全部補足できる\Throwableは便利だと感じましたが、

Error はアプリケーションのロジック中で発生させたり、捕捉したりしてはいけません。これは、言語上とても基本的な何かが間違っているという問題をプログラマーに教えるためにあります。なので、迂闊な例外処理に紛れてしまわないようになっています。
https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6#error

とあるように、常用するものではないようです。

関連記事

https://qiita.com/hnw/items/4e2d47d269a26025a726
https://qiita.com/jonsumisu/items/54a95d848f2dcf9cfde4
https://qiita.com/mpyw/items/c69da9589e72ceac470c
https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6

あとがき

今回、cronでTwitterAPIを1分ごとに叩く処理だったんですが、RateLimitに引っかかった際のレスポンスを想定していなかったため、数十分に一度エラーが発生するという状況になっていました。
Throwableでエラーをcatchしてレスポンスの内容をvar_dump()することで、レスポンスの内容を確認することができました。

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