1

私は、phpエラー処理と例外処理についていくつかの調査を行ってきました。

たとえば、ユーザーエラーを処理するにはset_error_handler()、ユーザーエラーに使用するのが最適です。コード例:

// Destinations
define("ADMIN_EMAIL", "nobody@stanford.edu"); 
define("LOG_FILE", "/my/home/errors.log");

// Destination types
define("DEST_EMAIL", "1");
define("DEST_LOGFILE", "3");

/**
* my_error_handler($errno, $errstr, $errfile, $errline)
*
* Author(s): thanosb, ddonahue
* Date: May 11, 2008
* 
* custom error handler
*
* Parameters:
*  $errno:   Error level
*  $errstr:  Error message
*  $errfile: File in which the error was raised
*  $errline: Line at which the error occurred
*/

function my_error_handler($errno, $errstr, $errfile, $errline)
{  
 switch ($errno) {
 case E_USER_ERROR:
  // Send an e-mail to the administrator
  error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);

  // Write the error to our log file
  error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE);
  break;

case E_USER_WARNING:
  // Write the error to our log file
  error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
  break;

case E_USER_NOTICE:
  // Write the error to our log file
  error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
  break;

default:
  // Write the error to our log file
  error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
  break;
}

// Don't execute PHP's internal error handler
return TRUE;
}


// Use set_error_handler() to tell PHP to use our method
$old_error_handler = set_error_handler("my_error_handler");

コードはhttp://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_perform_error_handling_in_PHPにあります。

次に、致命的なエラーの場合:

register_shutdown_function('handleShutdown');

function handleShutdown() {
    $error = error_get_last();
    if($error !== NULL){
        $info = "[SHUTDOWN] file:".$error['file']." | ln:".$error['line']." |    msg:".$error['message'] .PHP_EOL;
        yourPrintOrMailFunction($info);
    }
    else{
        yourPrintOrMailFunction("SHUTDOWN");
    }
}

PHPの致命的なエラーをキャッチする方法にあるコード。

私の知る限り、これはスクリプト内で発生する可能性のある基本的にすべてのエラーをカバーしているようです(非常に一般的なステートメントとして-すべてのエラーを予測することは困難です)。クラスを開発するときは、例外を使用して内部で処理することをお勧めします。

私の質問は、これらの例が本番環境でのエラーを処理するのに一般的に適切であると考えられるかどうか、または何かが明らかに間違っているか欠けているかどうかです。

いずれにせよ、これらの関数はすべてのファイルに添付されていますか、それともクラス内に設定されていますか?

どんな助けでも大歓迎です。

編集:私はまた、特定のエラーが発生した場合にスクリプトを停止するにはどうすればよいかを追加するつもりでした。明らかに、exit()またはdie()トリックを行いますが、そうするためにもっと適切なものはありますか?

4

3 に答える 3

1

私の質問は、これらの例が本番環境でのエラーを処理するのに一般的に適切であると考えられるかどうか、または何かが明らかに間違っているか欠けているかどうかです。

はい、そうです。生成されたすべての例外を確実にキャッチする必要があります。また、スクリプトにsynthaxエラーがある場合、またはサーバーの構成が不適切な場合、phpはコンパイル時エラーであるために処理されないエラーを出力する可能性があることも覚えておきたいと思います。

いずれにせよ、これらの関数はすべてのファイルに添付されていますか、それともクラス内に設定されていますか?

それらを(set_error_handlerで)登録すると、ファイルの1つがハンドラーを再定義する場合を除いて、スクリプトで呼び出されるすべてのファイルに適用されます。

スクリプトを停止するには、終了するのが良い方法です

于 2012-09-23T19:10:58.233 に答える
0

すべてのエラーを例外として処理するアプローチがありますが、それは問題ありません。1つまたは2つのプロジェクトでこれを実行し、結果に満足しています。

ただし、これに注意してください。警告と通知でさえ致命的になります(例外がキャッチされない場合は致命的であるため)。また、構文エラーは実行時エラーではなくコンパイル時(つまり、スクリプトがコンパイルされず、コード行も実行されなかったため)であるため、例外として処理されません。

于 2012-09-23T19:11:15.410 に答える
0

私の質問は、これらの例が本番環境でエラーを処理するのに一般的に適切であると考えられるかどうか、または明らかに間違っているか不足しているものがあるかどうかです。

PHP Errorsはい..特に複数のサーバーで作業している場合は、エラー用により良いストレージが必要です。

Exceptionsこれでは十分ではないと思います...タイプに応じて処理する必要があります。たとえば、 Database 、 Network などです。

于 2012-09-23T19:20:17.383 に答える