BEARのエラーハンドリングはPandaエラーハンドラーパッケージを利用しています。
デバック時にエラーが発生すると、詳細なバックトレースエラーの詳細な画面が出力されます。AJAXの場合はfirePHPを用いてfieBugコンソールにエラーが表示されます。
重要度やモードによって様々なところに出力されます。
- (開発時)FireBUGコンソール(
FireFox
+FireBug
+FirePHP
) - (開発時)画面上にトレースを伴う大きな表示
- (開発時)右上のBEARバッジの色とtooltip
- apacheエラーログ(すべてのエラー)
Panda(開発モード)ではエラーはアプリケーションのコードによるものか、それ以外かによって扱いが異なります。
Warning以上のエラーが出たときに、アプリケーションのコードで発生したときは大きく画面表示が出ますが、アプリケーション以外のフレームワークやライブラリでWarningが発生したときは右上のBEARバッジの表示がかわります。
debugモードかliveモードでハンドリングが変わります。
debug | 例外ハンドリング | エラーハンドリング |
---|---|---|
on(dev) | Panda | Panda |
off(live,prod) | Panda | PHP (PHP off) |
liveモードではパフォーマンスのためエラーハンドリングは原則行いません。 devモードでエラーハンドリングを行ってるときは設定エラーレベルを無視して全てのエラーに対して処理します。liveモードのエラー設定はアプリケーションが責任を持ちます。すなわちエラーレベルやapache/syslogどちらに表示するかなどphp.ini/.htaccessfで設定された値が使われます。
開発モード(Panda)では全てのエラーをerror_log
(Apacheでのエラー出力)します。同時にFirePHPでアプリケーション内のエラーと外のエラーを分けてFireBUGコンソールに出力しています。
Debugモードなら動作するのに、Liveモードでは実行できない事がある原因の一つにPHPのE_RECOVERABLE_ERROR
があります
E_RECOVERABLE_ERROR
キャッチできる致命的なエラー。危険なエラーが発生したが、 エンジンが不安定な状態になるほどではないことを表す。 ユーザ定義のハンドラでエラーがキャッチされなかった場合は、
E_ERROR
として異常終了する。 http://php.net/manual/ja/errorfunc.constants.php
このエラーはエラーハンドラーがない時は異常終了します。画面表示は行われずFatalエラーと同じように画面に何も表示されません。(エラー出力は行われてるのでapacheのログなどで発見できるはずです)
このエラーはライブラリ/BEARがarrayのタイプヒンティングで受けている引数をbooleanやemptyで渡した時に発生します。例えば以下の$configをnullで渡せばライブでは全く動かなくて、開発モードでは動作する状態になってしまいます。
(※エラーハンドラーが原因で動かないのではなくて、エラーハンドラーがあるから開発モードで動いていたことに注意してください。)
BEAR_Main::run($class, array $config);
開発モードでPandaを使わないようにするには以下のようにApp.php等でrestore_error_handler();
を加えます。例外ハンドラーも同様。
BEAR::init($app); // ここでアタッチされている
restore_error_handler(); //あるいは特定ページで
アプリケーション要求で独自のエラーハンドラーが必要な時は作成してBEAR::init()の後にset_error_handler()
でセットします。
PandaはFatalエラーをキャッチして画面表示する設定や、特定HTTPコードを簡単に出力する機能、HTML5専用のオンラインエディターAceなどの機能があります。詳しくはPandaのマニュアルやサンプルソースをご覧ください。