异常代码的严重性

时间:2019-07-05 15:28:20

标签: php exception error-handling error-code

我花了大约一周的时间来整理错误和异常处理程序。 (我64岁,忘记了一切十次,所以我很慢。)

出现致命错误时,我向自己发送一条短信,并收到其他错误。 (我在最后添加了数组,以防它们可能有用。)

对于错误,我有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 

2 个答案:

答案 0 :(得分:1)

例外

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

  

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

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

  

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

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

  

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

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

  

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

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

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

  

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

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

错误

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

使用PHP 7时,发生了一些变化。

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

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

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

答案 1 :(得分: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());
}

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