您的问题表明您正在使用EOL (生命尽头) 版本的 PHP(特别是 PHP
这可能是由于几个不同的原因造成的。一些最常见的如下:
- 您从错误处理程序或异常处理程序内部引发了异常。
- 您从析构函数内部引发了异常。
- 您从回调内部引发了异常(如输出缓冲回调函数)。
这是一个示例,演示了您在某些情况下的问题......
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
function myExceptionHandler($exception) {
echo "We got an exception with message: '{$exception->getMessage()}'";
}
function myCallBack($contents) {
trigger_error('ohnoes!'); // You can't throw an error from the output buffer callback function in older versions of PHP < 5.3
}
class Foo {
public function __destruct() {
trigger_error('ohnoes!'); // You can't throw an error from a destructor in older versions of PHP < 5.3
}
}
set_error_handler('myErrorHandler');
set_exception_handler('myExceptionHandler');
上面的代码会导致您看到您在此处描述的致命错误......
ob_start("myCallBack");
... 和这里...
$foo = new foo;
此问题已在 PHP >= 5.3.0 中得到修复,因此如果您使用的是最新版本的 PHP,则不应看到此问题。
最简单的修复方法是升级 PHP。如果这不是一个选择,您必须考虑这些事实,即您不能在 PHP 不希望抛出异常的地方抛出异常(在回调函数、错误处理程序、异常处理程序等中......实际上都被认为是PHP 回调)。
另一件事是你不应该以这种方式将每个错误都变成异常。如果您正在做的事情正如我提供的代码所示(即从错误处理程序内部抛出异常 - 从而将每个错误变成异常),那么您将导致自己a lot的痛苦,而且几乎没有任何好处。 PHP 错误不应该被处理。它们的目的是告知客户一个问题(客户端是编写 PHP 代码的人),或潜在的问题。处理错误本身并不像将每个错误都转换为异常然后处理该异常那么简单,因为并非每个错误都应该是异常的。例如,E_NOTICE 级别的错误在异常处理中没有地位。它们主要用于通知您可能存在错误,而不是您的代码一定存在错误,更不用说大多数错误甚至无法在用户空间代码中轻松处理(它们大多需要重新分解代码本身)。我强烈建议反对这种糟糕的做法.