我花了大约一周的时间来整理错误和异常处理程序。 (我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
答案 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);
}
然后在您的代码中,可以根据需要抛出SeriousRuntimeException
或TrivialRuntimeException
。在某些情况下,您将需要处理外部异常,因此需要像这样转换它们:
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());
}
在此示例中,我假设两种异常类型都是致命的,但是对它们的处理方式不同。可以想象,您可能会遇到一个异常类型,它是如此的琐碎,以至于应用程序一直在运行(例如,在侦听器循环中,它会记录故障然后继续执行)。