2010-11-28 7 views
5

私はPHPの初心者ですが、PHPのエラー処理は、エラーと警告が例外に散在している(と私をdie()で始めることはできません)と、少しのゲットーです。そのため、私のアプリケーションですべてのエラーケースを作成し、解釈し、処理するにはどのように最善の方法をとるべきかはわかりません。PHPでエラーを処理するためのこのアプローチには「問題がありますか?

攻撃の私の一般的な計画は概ね次の通りである:

  1. は、彼らが来るとしてエラーをラップするset_error_handler()を使用して、例外にすべての警告/エラーを変換します。
  2. 私が間違っていると予期していることを先取りして検査します。エラーを直接処理できない場合にのみ例外をスローします。通常のtry/catchブロックは、私が自分自身を投げない例外を処理するために、必要なときに配置されます。
  3. 私のアプリケーション全体(つまり、自分のindex.phpポイント・オブ・エントリー・ファイル)は、それ自体がtry/catchです。それが失敗すると、HTTP 500が投げられ、適切なエラーページが表示されます。おそらく、このページはヘッダ/ボディ/フッタのコレクションではなく、あらかじめコンパイルされた単一のファイルになります。これは主に、歪んだテンプレートファイルのような奇妙な例外をカバーするためです。私はこれが、Googleの500クラスのエラーページが他のすべてのものと大きく異なるように見えると考えています。
  4. #2と#3の結果として、私はすべての前払いを処理することを期待しているので、自分自身の例外をスローすることにした場合、ではなく、はエラーをキャッチし、私のトップレベルのハンドラまで。ここでの考え方は、起こったときに私がそれを処理できなければ、おそらくそれ以外のところではそれを扱うことができないということです。私はこれらのエラーに独自のサブクラス(おそらくCriticalErrorException)を与えることを考えています。これは私のログで直接識別できます/電子メールを出してすぐに調べることができます。一般的に、私はこれらが、がdevで起こることを期待していますが、プロダクションでアイロンをかけなければなりません。
  5. ログファイルにフェイルオーバーすると、そのファイルを一番上に表示するエラーがデータベースに記録されます。上で示したように重大なエラーが電子メールをトリガーします。レポートがファイルにフェイルオーバーした場合(つまり、DBエラーがある場合)、メールが送信されます。

これはほとんどのケースをカバーしていると思いますが、私が言ったように私はPHPにはとても新しいので、私が見落としているコーナーケースや奇妙な振る舞いがあるかどうかはわかりません。

私の計画の欠陥は何ですか?どうすればそれらを克服できますか?

+0

これは確かなアプローチです。 – DanMan

答えて

1

全体的に、予期しない例外をブロックすると、catchブロックに達し、HTTP 500を出力します(多くのフレームワークがそうです)。

私はかなりCriticalErrorException作りに同意しない - 多分あなたは今何かをキャッチするために期待していないが、あなたは(おそらく追加のアプリケーションの要件に直面して)将来的に取り扱うお使いのエラーが展開されます。自然なことは何でも投げてください。ほとんどの場合、単純なExceptionは問題ありません。

PHPエラーについて:E_ERRORを厳密に例外に変換する必要はありません(とにかく、あなたのアプリケーションを強制終了し、エラーログにも表示されます)。 E_NOTICEを処理するにはうまくいくでしょう。ほとんどの場合、通知はコードに正しくないことを意味します。警告を上げるPHPの関数について話したときに最後に

、私はこれで行くだろう:

// Assume that php_function() raises E_WARNING and returns FALSE on error 
// WARNING: if you have defined a custom error handler, IT WILL STILL BE CALLED 
//   even though the @ operator suppresses the error 
$result = @php_function($argument); // suppress error 
if (!$result) { 
    // error handling here 
} 

をこれに代えて:

try { 
    $result = php_function($argument); 
} 
catch (Exception $ex) { 
    // error handling here 
} 

例外に変換することはないということであることの理由すぐにエラーに反応しようとするときは、本当にあなたに何かを買う。逆に、最初のコードスニペットでは、エラー処理戦略に関する詳細情報が必要な場合は、php_functionのドキュメントを参照するように読者に指示します。 2番目のコードスニペットでは、開発者はアプリケーションで実装されたエラー処理に関する知識を持つ必要があります。

アップデート:私はあなただけの関数呼び出しから出てくるエラーを無視する@を使用する必要があることを

を言っていない「メートル。私が言っていることは、このように振る舞うレガシーPHP関数を使用するとき、そしてエラーを処理してそれから回復するために完全に準備されているときは、もはやアプリケーションの実行に関して "エラー"とはみなされないはずです。 この特定のケースでは、と表示されないように抑制することをお勧めします。

+0

あなたの@php_function($引数);ちょうどひどいです。 @はここでは何もしません。そして、ここでのエラー報告でエラー処理を台無しにしています。それは別の問題ですが。エラーは常に処理するかどうかにかかわらず*報告されます。 –

+0

"私はそれが好きではない"以外の引数はありますか? – Jon

+0

だから、私はE_ERRORを捕まえられません。それは私のアプリケーションを殺すだけで、どこに処理できないのでしょうか(これらのことはプロダクトの前にキャッチすべき構文エラーのようなものか、時には予期せず表示されることがありますか?)b)例外のすべてを'@'抑制を使いたい場合のカスタムエラーハンドラ関数?一般的にカスタムエラーハンドラを書く "良い"方法は何ですか? – AgentConundrum

関連する問題