uzullaがブログスマートフォン用の表示で見るuzullaがブログuzullaがブログです。2013-12-20扱いづらいPHPのエラー処理を適当にいなすphp追記この記事のやり方でもいいっちゃいいのですが、PHP7以降では"set_error_handler"でエラーを例外に変換せず、"Error"例外を直接キャッチするほうがよりスマートだと思います。Manualなので「例外でキャッチできないエラーがある」というのがほぼなくなった感じですね。$e)ではキャッチできない事に注意。PHPはエラーが扱いづらいいきなりですけど、PHPはエラーが扱いづらい言語だと思います。Errorとしないで、自前で画面にエラーを出しちゃう。結果、色々タチが悪い。エラーはもっと柔軟に扱いたい。回復出来るエラーは回復させたいですし、ちゃんとしたエラー画面を出したい。die的なもの含む)で書くと本当にコードが読みづらくて苦行だ。積極的に例外をつかうほうが良いと思う。*1DISCLAIMERここまでの話がよくわからん、画面にエラー出ないってなにそれ?という人は本エントリを参考にし無い方が良い。画面に出力されるエラー、便利だしね、変にエラーを抑えて詰むよりも画面にエラーをだして解決した方が良い。いってる事はわかるが同意できない、という人は理解した上だと思うので、それもまったく良いと思います。最初にオチ本エントリはこのGistの焼き直しです。0);error_reporting(E_ALL);を入れる事にしています。php.iniも最近はこれがデフォルトだったと思います。エラーは全部の種類がほしいですし*2、そもそも画面にエラーを出されるのはダサい*3。これをやると当然画面にエラーがでなくなるので、エラーログを見る必要が出ますね。このエントリを読むような人なら見れるでしょうが、宗教上や契約上の理由などでエラーログが見れない人はご愁傷様です。あと、これをやっても途中まで出力してから死ぬとやっぱカッコ悪いので、Webアプリならob_start()とかで出力バッファリングもしましょう。*4さて、一般的なエラーをどう扱うかここではエラーとかいてますが(実際エラーなので)、いわゆる例外で扱われるようなエラーをさしています。以下のコードで標準的な関数のエラーを例外に変換する事ができます(その関数からスローされたように見えます)。$errline);});ErrorExceptionクラスはError用のExceptionクラスです。http://www.php.net/class.errorexceptionたとえばエラーコードとかは$e->getCodeでとれるので、泥臭い実装すれば色々できます。コレ一ついれるだけでも深いコールからちゃんとキャッチできるので重要だと思います。*5これでファイル操作等で一行一行エラー処理をかかずとも、まとめてエラー処理できるのではかどりますね。スローしつつerror_log()出力するのも良い。ちなみに、最近のWAFでは最初からこれが設定されています。PHPerスキルのコピペをしたらおかしくなった!という場合は疑いましょう。例外でキャッチできないエラーがあるただ、例外ではキャッチできないエラーもあります。存在しない関数をコールすると、上記コードはコールされずに死にます。前述の画面にエラーを出さない系を設定していると「白い画面」が出ます、お客様がおこですね。「なんだよPHP駄目じゃん!すっごい不便じゃん!」と思うでしょう、俺もそう思う。そのFATAL系のエラーでも、多少リカバーする方法はあり、register_shutdown_function()を使います。"致命的なエラーが発生しました。}});このregister_shutdown_function()で「実行終了する時」に処理を差し込めます。「正常終了の時」もこれがコールされる、まあやったらわかる。イチイチエラーコードを取得して、そのエラーコードをみて挙動を変えています。エラーコードはこちらを見てください。http://www.php.net/manual/ja/errorfunc.constants.phpダサい、どうにも秘伝のタレ感ハンパないコードですが、これで例外で拾えない致命的なエラーもトラップできます。例外にできないの悔しいけど、ここに入ってくる=PHPのコードがおかしいレベルなので、諦めるしかない。いうか、ここに来る時点で、9割自分のコードが駄目なのであり、自分が悪い。「立派なプロダクト」なら、ここで「ユーザーに親切なエラーメッセージを出す」必要があると「私は」考えています。ちなみに、わかってるとおもいますがこれはあくまで解説用サンプルなんで、エラー詳細だしてますけど、こんなのぶっこんだらDisplay_errors指定してるのとかわりありませんからね。あと、「無駄な処理だな、遅そうだ」というご意見わかりますが、まあ一般的な処理の最後にこの程度追加しても誤差でした。まとめPHPでは良い感じにエラーを取り回すこと一つ取っても結構ダサくてさみしい。「白い画面」をだしたらお客様はおこであり、本当につらいのでがんばってへらしていきたいと思う(という強い心がけ)もっと良いやりかたをご存じでしたらば、教えてください。なんかエラそうな事かきましたけど、*6まだコードの中に@unlink("not_found_file_name");とかかいちゃう事がある程度には低俗です*7。サービスを追記しました。»プロフィールid:uzullauzullaがブログです。参加してきました!月別アーカイブ参加グループWindows開発者はてなブログをはじめよう!uzullaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。