PHP 打印调用堆栈信息

WBOY
풀어 주다: 2016-06-20 12:32:51
원래의
2164명이 탐색했습니다.

在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);}?>
로그인 후 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿