5

我编写了错误处理类,它将所有错误分为正常错误(通知、警告、...)和严重错误。

现在我发现将所有错误转换为异常是一个好习惯。它还会缩短我的代码。

但是,我不确定如何处理这个......

  1. 是否存在不会停止脚本执行的异常以及会停止脚本执行的异常?如果没有...如何区分转换后的错误?
  2. 将错误转换为异常是通过调用 set_error_handler() 并在其中抛出新的 ErrorException() 来完成的……下一步是什么?set_exception_handler() 是自动调用的吗?
4

4 回答 4

3
  1. 捕获的异常不会停止您的脚本,所有未捕获的异常都会停止。

  2. 不,set_exception_handler()不会自动调用,如果你愿意,你可以这样做。

    您设置的异常处理程序set_exception_handler()在异常未被捕获后被调用,它是在脚本终止之前被调用的最后一段代码。确保它不会导致错误/异常,否则会以失败告终。

于 2012-11-25T17:48:49.797 回答
2
  1. 是否存在不会停止脚本执行的异常以及会停止脚本执行的异常?如果没有...如何区分转换后的错误?

如果异常被捕获,它们不会停止脚本执行。要识别转换后的错误:

try {
    // ...
} catch (ErrorException $e) {
    // converted error (probably)
} catch (Exception $e) {
    // another kind of exception; this basically catches all
}

或者:

function handle_exception(Exception $e)
{
    if ($e instanceof ErrorException) {
        // converted error (probably)
    } else {
        // another kind of exception
    }
}
set_exception_handler('handle_exception');

请注意,ErrorException任何代码都可以抛出它,但它仅用于转换set_error_handler()注册函数中的常规错误。

  1. 将错误转换为异常是通过调用 set_error_handler() 并在其中抛出新的 ErrorException() 来完成的……下一步是什么?set_exception_handler() 是自动调用的吗?

如果您的错误处理函数抛出ErrorException的错误没有在代码中的其他任何地方捕获,set_exception_handler()则将调用已注册的异常处理程序(使用设置)。

于 2012-11-25T18:11:43.273 回答
2

任何未捕获的异常都将停止执行您的脚本。

当抛出异常时,语句后面的代码将不会被执行,PHP 将尝试找到第一个匹配的 catch 块。 如果未捕获到异常,则会发出 PHP 致命错误,并带有“未捕获的异常 ...”消息,除非已使用 set_exception_handler() 定义了处理程序。

请参阅有关此的文档

至于set_exception_handler()- 它不会自动调用,但它是您对发生的问题做出反应的最后手段

如果在 try/catch 块中未捕获到异常,则设置默认异常处理程序。调用 exception_handler 后将停止执行。

于 2012-11-25T17:49:20.973 回答
0

请记住,您只能将警告转换为异常,错误不能转换为异常,因为错误处理程序没有运行。

set_error_handler(function ($severity, $message, $file, $line) {
  echo 'You will never see this.'
});

// Provoke an error
function_that_does_not_exist();

可以使用关闭功能“捕捉”它们,但这超出了问题的范围。

于 2016-10-24T12:38:48.823 回答