我会通过不解决它来解决这个问题......让我解释一下:
目前无法从未捕获的异常中禁用堆栈跟踪。 PHP 不允许你这样做。
所以,与其尝试禁用它,我不会让异常未被捕获...我会安装一个exception handler,然后它会记录回溯信息。我不会在屏幕上显示它。我不会检查它在哪个环境中。我不会检查请求信息。我只是将它记录到一个文件中,然后显示一个通用的 500 服务器错误页面。
现在,在您的处理程序中,您可以选择性地显示调用信息,因此您可以选择是否记录参数信息:
set_exception_handler(function($exception) {
$log = array(
'message' => $exception->getMessage(),
'trace' => array(),
);
foreach ($exception->getTrace() as $item) {
$trace = isset($item['class']) ? $item['class'] . $item['type'] : '';
$trace .= $item['function'] . '()';
$log['trace'][] = $trace;
}
save_to_log($log);
});
但我将未捕获的异常视为您的应用程序中存在错误的标志。你应该找到它们并修复它们。如果你得到的足够多以至于你担心在页面中显示参数,那么你真的需要首先解决存在未捕获异常的事实......
编辑以下是所发生情况的演示:
class Foo {
public function doSomething($user, $password) {
throw new Exception('Something Went Wrong!');
}
}
$f = new Foo();
$f->doSomething('user', 'passw');
on CodePad 结果:
<br />
<b>Fatal error</b>: Uncaught exception 'Exception' with message 'Something Went Wrong!' in /code/MxH9Ls:4
Stack trace:
#0 /code/MxH9Ls(10): Foo->doSomething('user', 'passw')
#1 {main}
thrown in <b>/code/MxH9Ls</b> on line <b>4</b><br />
但是,使用异常处理程序(修改为打印而不是日志):
set_exception_handler(function($exception) {
$log = array(
'message' => $exception->getMessage(),
'trace' => array(),
);
foreach ($exception->getTrace() as $item) {
$trace = isset($item['class']) ? $item['class'] . $item['type'] : '';
$trace .= $item['function'] . '()';
$log['trace'][] = $trace;
}
echo $log['message'] . "\n";
foreach ($log['trace'] as $trace) {
echo " - $trace\n";
}
});
class Foo {
public function doSomething($user, $password) {
throw new Exception('Something Went Wrong!');
}
}
$f = new Foo();
$f->doSomething('user', 'passw');
On CodePad 产生:
Something Went Wrong!
- Foo->doSomething()