ホームページ >バックエンド開発 >PHPチュートリアル >PHP 呼び出しスタック情報を出力する

PHP 呼び出しスタック情報を出力する

WBOY
WBOYオリジナル
2016-06-20 12:32:512183ブラウズ

PHP でエラーが発生した場合、set_error_handler を使用してそれを処理します。例外が発生した場合は set_Exception_handler が使用されますが、デバッグでは

debug_print_backtrace と debug_backtrace を使用してコール スタック情報を出力することもできます

set_error_handler の使用

<?php// error handler functionfunction myErrorHandler($errno, $errstr, $errfile, $errline){    if (!(error_reporting() & $errno)) {        // This error code is not included in error_reporting        return;    }    switch ($errno) {    case E_USER_ERROR:        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";        echo "  Fatal error on line $errline in file $errfile";        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";        echo "Aborting...<br />\n";        exit(1);        break;    case E_USER_WARNING:        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";        break;    case E_USER_NOTICE:        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";        break;    default:        echo "Unknown error type: [$errno] $errstr<br />\n";        break;    }    /* Don't execute PHP internal error handler */    return true;}// function to test the error handlingfunction scale_by_log($vect, $scale){    if (!is_numeric($scale) || $scale <= 0) {        trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);    }    if (!is_array($vect)) {        trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING);        return null;    }    $temp = array();    foreach($vect as $pos => $value) {        if (!is_numeric($value)) {            trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE);            $value = 0;        }        $temp[$pos] = log($scale) * $value;    }    return $temp;}$old_error_handler = set_error_handler("myErrorHandler");?>

set_Exception_handler の使用

<?phpfunction exceptionHandler($exception) {    // these are our templates    $traceline = "#%s %s(%s): %s(%s)";    $msg = "PHP Fatal error:  Uncaught exception '%s' with message '%s' in %s:%s\nStack trace:\n%s\n  thrown in %s on line %s";    // 打印异常调用堆栈信息    $trace = $exception->getTrace();    foreach ($trace as $key => $stackPoint) {       //返回异常类似,异常描述信息        $trace[$key]['args'] = array_map('gettype', $trace[$key]['args']);    }    // 格式化异常信息    $result = array();    foreach ($trace as $key => $stackPoint) {        $result[] = sprintf(            $traceline,            $key,            $stackPoint['file'],            $stackPoint['line'],            $stackPoint['function'],            implode(', ', $stackPoint['args'])        );    }    // trace always ends with {main}    $result[] = '#' . ++$key . ' {main}';    // write tracelines into main template    $msg = sprintf(        $msg,        get_class($exception),        $exception->getMessage(),        $exception->getFile(),        $exception->getLine(),        implode("\n", $result),        $exception->getFile(),        $exception->getLine()    );    error_log($msg);}?>


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。