如果您正在处理敏感数据,并且您不想在抛出异常时记录有关变量内容的详细信息,您可能会发现自己沮丧地寻找构成正常堆栈跟踪输出的各个部分,以便您可以保留其可读性,但只需更改几件事。在这种情况下,这可能对您有所帮助
<?php
function exceptionHandler($exception) {
$traceline = "#%s %s(%s): %s(%s)";
$msg = "PHP 致命错误: 未捕获异常 '%s',消息为 '%s',位于 %s:%s\n堆栈跟踪:\n%s\n 在 %s 的第 %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'])
);
}
$result[] = '#' . ++$key . ' {main}';
$msg = sprintf(
$msg,
get_class($exception),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine(),
implode("\n", $result),
$exception->getFile(),
$exception->getLine()
);
error_log($msg);
}
?>
如果你不喜欢 sprintf() 或者重复的 $exception->getFile() 和 $exception->getLine() 调用,当然可以随意替换它们 - 认为这只是一个部分的编译。