PHP查看堆栈信息,PHP 打印调用堆栈信息

在PHP中发生错我,我们使用set_error_handler进行处理,如果发生异常,则使用set_exception_handler,但是在调试中,我们也可以使用

debug_print_backtrace和debug_backtrace进行调用堆栈信息打印

set_error_handler的使用

// error handler function

function 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 "My ERROR [$errno] $errstr
\n";

echo "  Fatal error on line $errline in file $errfile";

echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
\n";

echo "Aborting...
\n";

exit(1);

break;

case E_USER_WARNING:

echo "My WARNING [$errno] $errstr
\n";

break;

case E_USER_NOTICE:

echo "My NOTICE [$errno] $errstr
\n";

break;

default:

echo "Unknown error type: [$errno] $errstr
\n";

break;

}

/* Don't execute PHP internal error handler */

return true;

}

// function to test the error handling

function 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的使用

function 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);

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值