【问题标题】:Severity of exception codes异常代码的严重性
【发布时间】:2019-11-16 06:00:59
【问题描述】:

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

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


【解决方案1】:

例外情况

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

是否有异常的严重性代码?

没有。所有例外情况都很严重。
异常将停止执行您的脚本。它们用于防止前面的代码无法执行时执行后面的代码。

我如何知道它们是否重要?

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

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

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

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

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

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

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

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

错误

PHP 的历史很糟糕。早期 PHP 版本的问题之一是它在处理糟糕的代码时非常宽松。它要么尝试猜测正确的操作应该是什么,要么仅仅警告用户一些严重的问题。这样做的结果是,许多开发人员学会了简单地忽略警告、通知,有时甚至是错误。

PHP 7 改变了一些东西。

PHP 7 改变了 PHP 报告大多数错误的方式。不再通过 PHP 5 使用的传统错误报告机制报告错误,现在大多数错误都是通过抛出 Error 异常来报告的。错误仍然不是一个例外,但它的行为就像一个。您可以捕获错误,如果没有,您仍然会看到 “致命错误:未捕获的错误:...”

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

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

【讨论】:

    【解决方案2】:

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

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

    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());
    }
    

    在这个例子中,我假设这两种异常类型都是致命的,但它们的处理方式不同。可以想象,您可能有一个非常微不足道的异常类型,以至于应用程序继续运行(例如,在侦听器循环中 - 它记录故障然后继续运行)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-11
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2012-09-04
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多