PHPでのエラーのタイプと処理

5717 ワード

PHPのエラーには、次のようなタイプがあります(このテーブルの内容はPHPドキュメントから取得されます).

定数
説明
コメント
1
E_ERROR
致命的なランタイムエラー.このようなエラーは、メモリ割り当てによる問題など、リカバリ不可能な場合が一般的です.結果として、スクリプトが終了し、実行を続行しなくなります.
 
2
E_WARNING
実行時の警告(致命的でないエラー).プロンプトのみが表示されますが、スクリプトは実行を終了しません.
 
4
E_PARSE
コンパイル時に構文解析エラーが発生しました.解析エラーはアナライザのみで発生します.
 
8
E_NOTICE
実行時通知.スクリプトがエラーとして表示される可能性がありますが、正常に実行できるスクリプトにも同様の通知がある可能性があります.
 
16
E_CORE_ERROR
PHP初期化起動中に発生した致命的なエラー.このエラーはE_に似ていますERRORですが、PHPエンジンコアで発生しています.
since PHP 4
32
E_CORE_WARNING
PHP初期化起動中に発生した警告(致命的でないエラー).類似E_WARNINGですが、PHPエンジンコアによって生成されます.
since PHP 4
64
E_COMPILE_ERROR
致命的なコンパイル中にエラーが発生しました.類似E_ERRORは、Zendスクリプトエンジンによって生成されます.
since PHP 4
128
E_COMPILE_WARNING
コンパイル時の警告(致命的でないエラー).類似E_WARNINGは、Zendスクリプトエンジンによって生成されます.
since PHP 4
256
E_USER_ERROR
ユーザーによって生成されたエラー情報.類似E_ERRORですが、PHP関数trigger_はユーザー自身がコードに使用します.error()が生成します.
since PHP 4
512
E_USER_WARNING
ユーザーが生成した警告情報.類似E_WARNINGですが、PHP関数trigger_はユーザー自身がコードで使用します.error()が生成します.
since PHP 4
1024
E_USER_NOTICE
ユーザが生成した通知情報.類似E_NOTICEですが、ユーザー自身がコードにPHP関数trigger_を使用しています.error()が生成します.
since PHP 4
2048
E_STRICT
PHPによるコード修正の推奨を有効にして、コードの相互運用性と前方互換性を確保します.
since PHP 5
4096
E_RECOVERABLE_ERROR
スナップ可能な致命的なエラー.非常に危険なエラーが発生した可能性がありますが、PHPエンジンが不安定な状態になっていません.このエラーがユーザー定義ハンドルによってキャプチャされていない場合(set_error_handler()を参照)、E_になります.ERRORにより、スクリプトは実行を終了します.
since PHP 5.2.0
8192
E_DEPRECATED
実行時通知.有効にすると、将来のバージョンで正常に動作しない可能性があるコードに警告します.
since PHP 5.3.0
16384
E_USER_DEPRECATED
ユーザーの生産量が少ないという警告メッセージ.類似E_DEPRECATEDですが、ユーザー自身がコードにPHP関数trigger_を使用しています.error()が生成します.
since PHP 5.3.0
30719
E_ALL
E_STRICTを除くすべてのエラーと警告メッセージ.
30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously
いくつかのよくあるエラーの具体例は以下の通りです.
エラーのタイプ
実例
エラーメッセージ
E_ERROR
存在しない関数を呼び出します.たとえばmysql拡張を有効にしないでmysql_を使用します.connect
Fatal error: Call to undefined function mysql_connect()
E_WARNING
存在しないPHPファイル、例えばinclude"none.php";
Warning: include(none.php): failed to open stream: No such file or directory
ゼロで割る、例えばecho 3/0;
Warning: Division by zero
E_PARSE
文の末尾にセミコロンがない
Parse error: syntax error, unexpected T_VARIABLE, expecting ',' or ';'
E_NOTICE
echo$noexistなどの未定義の変数を使用します. 
Notice: Undefined variable: noexist
echo$_などの未定義の配列要素を使用するGET["option"];
Notice: Undefined index: option
PHPのプロファイルphp.Iniでは、エラーの記録方法を設定できます(PHPスクリプトではini_set関数で設定できます).例:
オプション
デフォルト
開発環境
せいさんかんきょう
error_reporting
E_ALL & ~E_NOTICE
E_ALL | E_STRICT
E_ALL & ~E_DEPRECATED
display_errors
On
On
Off
display_startup_errors
Off
On
Off
log_errors
Off
On
On
error_log
NULL
"php_error.log"
"php_error.log"
つまり、開発環境ではPHPにすべてのエラーを報告して表示させるのが一般的ですが、生産環境ではPHPにほとんどのエラーを報告させますが、表示しません.また、さまざまなエラーをログファイルに記録する必要があります.
set_も使えますerror_handler関数は自分でエラーを処理します.例:
function myErrorHandler($errno, $errstr, $errfile, $errline) {

    if (!(error_reporting() & $errno)) {

        //     error_reporting()       

        return;

    }



    switch ($errno) {

    case E_USER_ERROR:

        echo "error: $errstr<br />
"; echo "error: on line $errline in file $errfile<br />
"; exit(1); break; case E_USER_WARNING: case E_WARNING: echo "warning: $errstr<br />
"; break; case E_USER_NOTICE: case E_NOTICE: echo "notice: $errstr<br />
"; break; default: echo "unknown error: [$errno] $errstr<br />
"; break; } // true PHP return true; } set_error_handler("myErrorHandler");

set_error_handler関数は、PHPスクリプトが実行できないエラー(E_など)を処理できません.ERROR,E_PARSEとほとんどのE_STRICTエラー.この場合、register_を参照してください.shutdown_function関数.また、@演算子でマスクされたエラーについてはerror_Reporting()関数の戻り値は0で判断します.
実際、set_でerror_handler関数は、すべてのエラーをログに記録してログを表示するほうが便利です.
同様に、ユーザ定義の例外にはset_があるexception_handler関数は処理できます.
参考資料:[1]PHP: Predefined Constants - Manual[2]PHP: Runtime Configuration - Manual[3]PHP: error_reporting - Manual[4]PHP: set_error_handler - Manual[5]PHP: Error Control Operators - Manual[6]PHP: register_shutdown_function - Manual[7]PHP: set_exception_handler - Manual[8]Reference - What does this error mean in PHP? - Stack Overflow[9]PHP用set_error_handler()ブロッキングプログラムのエラー[9]