17

リファクタリングしたばかりのphpアプリケーションがあります。残念ながら、次のような警告が表示されます。

警告:preg_match()は、パラメーター2が文字列であることを想定しています。オブジェクトは/home/yacoby/dev/netbeans/php/Zend/Db/Select.phpの776行目にあります。

コールスタックがないため、コードのどの部分が警告を引き起こしていて、コードがたくさんあるのかわからないため、問題を解決することは不可能です(または非常に大変な作業です)。

警告をエラーのように処理する方法(アプリケーションが停止してスタックトレースを出力する)、またはエラーを出力するときにスタックトレースを表示する方法が必要です。これを行う方法はありますか?

4

3 に答える 3

25

http://www.php.net/manual/en/class.errorexception.phpの例1を参照してください。

<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Trigger exception */
strpos();
?>
于 2010-01-15T11:22:00.037 に答える
10

set_error_handler()E_WARNINGが発生したときにスタックトレースを出力するために、これを見て、スクリプトの最初またはブートストラップに含めてください。

function stacktrace_error_handler($errno,$message,$file,$line,$context)
{
    if($errno === E_WARNING) {
        debug_print_backtrace();
    }
    return false; // to execute the regular error handler
}
set_error_handler("stacktrace_error_handler");

さまざまなタイプをより詳細に制御するには、回答の他の場所に投稿されたより明示的なバージョンをご覧ください。

于 2010-01-15T11:30:31.077 に答える
4

set_error_handler()を使用して独自のエラーハンドラを定義できます

ハンドラー関数では、エラーの各クラスを必要に応じて処理できます。これが私が使用する基本的なテンプレートです。私の場合、致命的なエラーのみを処理したいので、通知と警告は無視します。

あなたの場合、警告のバックトレースを実行するか、必要に応じてログに記録することができます

function error_handler($errno,$message,$file,$line,$context) {

switch($errno) {
    // ignore warnings and notices
    case E_WARNING:
    case E_NOTICE:
    case E_USER_NOTICE:
    case E_USER_WARNING:
        break;
    // log PHP and user errors
    case E_ERROR:
    case E_USER_ERROR:
              // Do some processing on fatal errors
    }
}
于 2010-01-15T11:21:35.883 に答える