2009-07-03 12 views
5

ありがとうございました。PHPエラー処理

私は現在、私の会社のために最初から書きましたMVCフレームワークを調整/改善しています。それは比較的新しいので、それは確かに不完全です。フレームワークにエラー処理を組み込む必要があります(すべてがエラー処理にアクセスする必要があります)、さまざまなタイプとレベルのエラー(ユーザーエラーとフレームワークエラー)を処理できる必要があります。私の質問は、これを行うための最善の方法と最高の仕組みは何ですか?私はPHP 5の例外処理とPEARのさまざまなエラーメカニズムを知っていますが、私はそれらのどれも使用していません。効率的で使いやすいものが必要です。

私自身のエラー処理を作成するか、既に作成されたものを使用する方が良いでしょうか?どんな提案、ヒント、質問も確実に歓迎されます。私は最終的にPHPを使ってエラーハンドラを登録することを甘く思うので、エラーをスローしてから何をするべきか、そして続行するかどうかを決定するだけです。

EDIT:申し訳ありませんが、私が記録したいエラーの種類の詳細を提供する必要があります。私は2つの主要な種類のエラー、つまりユーザーとフレームワークをログに記録します。

ユーザーエラーの場合は、悪いURL(404)、制限付きページへの不正アクセスなどを意味します。私はホームページにリルートするか、JavaScriptダイアログボックスを外すことができますが、これらのエラーを優雅に処理し、明らかになったときにユーザーエラーを追加することができます。私は、データベースに接続できないようなものを意味Frameworkのエラーによって

、誰かが事故にデータベーステーブルを削除または何らかの形でファイルを削除したが、その他

また、私が開発し、ライブサーバーの処理の世話をします。

+0

答えはありませんが、dev/production環境を処理することを忘れないでください:) – marcgg

答えて

5

私は最終的にはそれが私がちょうどエラーをスローし、それをどうして続行するかどうかをするために何 決める する必要がありますように、何とかPHPでエラーハンドラ を登録する を甘思うだろう。

set_error_handler()set_exception_handler()で正確に行うことができます。

エラー処理には「正しい方法」はありませんが、考慮すべき点がいくつかあります。

  • trigger_error()は、両方とも現在の実行からすぐにエスケープし、trigger_error()はキャッチ可能ではないという点で、新しい例外をスローするのと同じです。本番環境での
  • どのようにして(画面上でshow?)のdevの環境上で処理エラーをしたいですか対(ログインして電子メールで送信?)
  • あなたは、本質的に、例外にエラーを「変換」するために、上記の機能を使用することができ、またはバイスその逆
  • すべてのエラーの種類が
+0

ありがとう、私はそれらの機能について知りませんでした。 devサーバでエラーが発生した場合は、エラーの種類とレベルに応じて、画面(またはFirebugコンソール)とライブサーバのログ/電子メールでぼやけてしまいます。 –

+0

これをいくつかのカスタム例外クラスと組み合わせることにします。 –

5

カスタムエラーハンドラで処理できるわけではありませんここで私は通常行ういくつかのものです:

  • はdeveloを切り替えるには、グローバルコンフィギュレーション設定やフラグを使用します生産と生産。
  • 選択肢があるときにはPHPエラーを使用しないでください。エラーハンドリングの例外を優先します。例外を使用しないライブラリを使用している場合は、エラーを検出して独自の例外をスローします。
  • 例外を簡単に読み取ることができる例外キャッチャーを使用します。このtry-catch-blockを戦略的に配置すると、グローバル例外ハンドラを登録する必要はありません。
  • 常に開発するerror_handeling(E_ALL | E_STRICT)
  • set_error_handler()を使用してPHPの警告と注意をキャッチし、実行を停止します。これにより、結果として非常に堅実なコードで、事前に多くのバグが排除されます。
  • エラーを回避するために、グローバルエラーハンドリングコードは非常に軽量でなければなりません。グローバルエラーハンドラを扱うときは常に再帰のリスクがあります。
  • システムが運用モードの場合は、詳細を表示しないでください。エラーをログに記録し、バグを報告したりエラーを報告したりする場合にユーザーが参照できる一意の識別子を生成します。
+1

ヒントをありがとう。私は、開発中にそのようなset_error_handler()を使うことは考えていませんでした。 –

2

大きなサイトで作業している場合は、テスターやユーザーが奇妙なユースケースを引き起こしたときに意図しないロジックパスにカスケードする可能性がある場合は、エラーの履歴を理解することをお勧めします。

私は、エラーをログに記録し、何か致命的な場合に実行を停止することができるtry catchブロックを構築する傾向があります(また、エラーコードで正面のエラーページを吐き出す)か、ソフトエラー、私のエラーログにはそれに気づいています。ほとんどの場合、カスタムエラーハンドラを構築することになります。なぜなら、スケールアップすると、あまりにも多すぎるニュアンスがあるからです。

開発中、ParticletreeのPHPプロファイラを使用して、エラーやその他の関連データをトレース、メッセージ、およびラインでコンソールに記録します。それはちょうどきれいです - その効率性について話すことはできません。それはコードを膨らませることができますが、ああ、私の良い神、エラーが発生した場所と方法をプレーンテキストで理解することは命を救うことができます。 SOAP Webサービスのようなものを扱うときには、例外をスローするような場合に特に役に立ちます。

また、デバッグログを抽象化してグローバルにしておくと、人々が以前に言ったように、プロダクションに切り替えると、すべての種類の汚れた洗濯物を冷たいインターネットの空気デバッガの出力をSQLデータベースや電子メールなどに変更するのが比較的簡単にできるためです。

Particletreeのプロファイラ:http://particletree.com/features/php-quick-profiler/

+0

私は以前PEARのLogクラスを使っていましたが、私が気に入っているのは、さまざまなロギングメカニズム(電子メール、データベース、ファイル、コンソールなど)を処理できる点です。私は正しい場所にエラーを記録するためにそれを使用することを考えています。 –

0

ライブ行く前に私はPHPのエラーを追跡するために(私はPleskコントロールパネルを使用して)私のエラーログを確認し、開発中に完全にキーの段階で私のプロジェクトをテストします。

クラスまたはアプリケーションの重要な段階でプロジェクトが公開されている場合は、クラスを使用してエラーまたはデバッグレポートを送信します。エラーレポートは、datetime、user ip、参照ページ、完全なURL、およびデバッグクラスのトリガ/呼び出し時に定義する短い注記などの重要な情報を含む定義済みの電子メールアドレスに送信されます。

私はログファイルを書き込むよう強制していますが、ディレクトリが777のchmodを持っていて、毎回最新のログにアクセスしなければならないので、この両方が安全でないことがわかりました。それらを私に電子メールで送ることで、問題はすぐに解決されます。

+0

ありがとう、私はエラータイプ/レベルを基準にログオンできるようにビルドしたいと思います。いくつかのエラーはログに記録され、他のログにはエラーページが表示され、その他にはエラーページが表示され、エラーが記録され、電子メールが送信されます。 –