异常代码的严重程度

问题描述 投票:1回答:2

我正在尝试整理错误和异常处理程序。遇到致命错误,我向自己发送了一条短信,而遇到其他错误,我收到了电子邮件。 (我在最后添加了数组,以防它们可能有用。)

关于错误,有https://php.net/manual/en/errorfunc.constants.php我,但找不到异常类似的东西。

我相信我可以设置自己的异常值,但是对于一般异常,PDOExceptions等,是否具有约定的严重性级别。我发现唯一提到的严重性级别是在ErrorException中。 (我目前仅使用PDOExceptions,但试图捕获其他“通用”异常。)

严重性帮助程序图表在某处可用吗?我自由地承认我在例外方面挣扎。

PS,我看了https://www.php.net/manual/en/errorexception.getseverity.php,但看起来像是作为异常发送的错误。我现在很困惑。


错误代码数组,以防它们有用。

$phpErrorCodes = array (
1   => "E_ERROR",
2   => "E_WARNING",
4   => "E_PARSE",
8   => "E_NOTICE",
16  => "E_CORE_ERROR",
32  => "E_CORE_WARNING",
64  => "E_COMPILE_ERROR",
128 => "E_COMPILE_WARNING",
256 => "E_USER_ERROR",
512 => "E_USER_WARNING",
1024 => "E_USER_NOTICE",
2048 => "E_STRICT  E_ALL",
4096 => "E_RECOVERABLE_ERROR",
8192 => "E_DEPRECATED",
16384=> "E_USER_DEPRECATED",
32767=> "E_ALL");

$phpErrorCodesFatal = array (
1   => "E_ERROR",
16  => "E_CORE_ERROR",
64  => "E_COMPILE_ERROR",
4096 => "E_RECOVERABLE_ERROR");

$phpErrorCodesFatalNumberOnly = array (
    1   ,
    16  ,
    64  ,
    4096);

//4096 recoverable but dangerous so treated as fatal 
php exception error-handling error-code
2个回答
1
投票

例外

让我尝试在这里澄清一些误解。

是否有例外的严重性代码?

没有所有例外情况都很严重。异常将停止脚本的执行。如果无法执行前面的代码,则使用它们来防止执行后面的代码。

我怎么知道它们是否重要?

所有例外都很重要。触发异常时,它会告诉您作为开发人员的代码中发生了意外情况。您编写的代码根本没有预料到会发生这种情况,并且为防止发生未定义的行为,它应立即停止处理。

未处理的异常将显示为PHP警告。 -mario

这是不正确的。任何未处理的异常都将转换为PHP Fatal error。如果您的应用程序不知道如何处理这种特殊情况,那么PHP必须立即停止!这不是警告,可以忽略或沉默,这是一个致命错误。

根据经验,我应该将异常视为致命错误吗?

不一定。在极少数情况下,开发人员可能期望特定的代码段引发异常,这可以从中恢复或解决。代码逻辑预计会出问题,并且可以解决问题。如果捕获并处理了异常,则不会导致致命错误。

异常和致命错误之间的区别是,您可以捕获异常并从中恢复,但不能从致命错误中恢复。

所以,如果我什么都不做,那么异常就会变成错误。

如果没有捕获到异常并且没有实现自己的错误处理,则PHP将默认为内置错误处理程序。逻辑是它将停止脚本并抛出异常(异常作为消息)。然后,根据您的配置设置,该错误将被记录在服务器上或显示给用户。

错误

PHP历史悠久。早期PHP版本的问题之一是,在编写不好的代码时,它非常宽容。它将试图猜测正确的动作是什么,或者只是警告用户一些严重的问题。结果是,许多开发人员学会了简单地忽略警告,注意甚至错误。

使用PHP 7,几件事发生了变化。

PHP 7更改了PHP报告大多数错误的方式。现在,不是通过PHP 5使用的传统错误报告机制来报告错误,而是通过抛出Error异常来报告大多数错误。错误仍然不是例外,但其行为类似于一个错误。您可以捕获该错误,否则,您仍然会看到“致命错误:未捕获的错误:...”

现代PHP功能现在将使用异常。这意味着用户域代码也应尝试遵循相同的方法。当您的代码应停止执行时引发异常(请勿使用die/exit),仅在知道如何恢复时才捕获它们。

随着将来的PHP版本的发布,通知和警告可能会更改为错误异常。现在不要忽略它们。在代码中将所有这些问题视为严重问题并立即修复。


0
投票

根据评论,关于异常的一般建议是,您应该全部捕获它们-从这个意义上说,所有未处理的异常都是严重的。

但是,您仍然可以按照所需的方式对系统中的异常进行分类。假设您在应用程序的顶层有一个呼叫进入主应用程序:

try
{
    $this->mainApp();
}
catch (SeriousRuntimeException $e)
{
    $this->handleSeriousError($e);
}
catch (TrivialRuntimeException $e)
{
    $this->handleTrivialError($e);
}

然后在您的代码中,您可以根据需要抛出SeriousRuntimeExceptionTrivialRuntimeException。在某些情况下,您将需要处理外部异常,因此需要像这样转换它们:

try
{
    $this->databaseOperation();
}
catch (PDOException $e)
{
    // Copy the exception properties that are important to you.
    // Throw the appropriate severity based on what handler you
    // want to run.
    throw new SeriousRuntimeException($e->getMessage());
}

在此示例中,我假设两种异常类型都是致命的,但是它们的处理方式不同。可以想象,您可能会遇到一个异常类型,它是如此的琐碎,以至于应用程序一直在运行(例如,在侦听器循环中,它会记录故障然后继续执行)。

© www.soinside.com 2019 - 2024. All rights reserved.