PHP:触发致命错误?

Posted

技术标签:

【中文标题】PHP:触发致命错误?【英文标题】:PHP: Trigger fatal error? 【发布时间】:2013-03-31 00:07:45 【问题描述】:

我希望能够在我的 php 类中抛出一个致命的、无法捕获的错误,因为我的类的用户滥用它来做我不打算做的事情。我不希望他/她能够通过 catch 子句恢复。 我知道trigger_error,但我只能让它发出警告或通知。

【问题讨论】:

何必呢?谁在实现你的课程: 1. 是一名程序员。 2. 可以访问源。 3. 可以并且很可能会删除trigger_error() 调用。 @Sammitch:我想明确我的意图。我想让任何使用我的代码的人知道他们所做的并不是我打算让他们使用它的方式。对我来说,抛出异常会发送消息“你处理这种未定义的行为”。我想发送消息:“不要那样做,而是那样做”。 示例库。例如,如果某些条件不成立,您绝对不应该做某事。 (对不喜欢阅读文档的人有用:P) @bwoebi:正是我的情况;-) 我意识到这是一个 7 年前的问题,但即便如此,有人可能会遇到它。您认为异常将消息发送给程序员以处理未定义行为的想法是完全错误的。这不是例外的意思。程序员会这样想的唯一方法是,如果他们对编程一无所知,或者他们做出随机和疯狂的假设。例外只是更清洁。同样触发错误并不意味着他们无法从中恢复。他们仍然可以以与异常处理类似的方式使用错误处理。 【参考方案1】:

E_USER_ERROR 是合适的常数。

trigger_error("Fatal error", E_USER_ERROR);

另见manual page 和list of PHP Errors 的第一个示例(只有以 E_USER* 开头的可以从 trigger_error 发出)。

【讨论】:

非常讽刺的是,那个说“对不喜欢阅读文档的人有用”的人没有费心阅读手册页的第一个示例。【参考方案2】:

注意:如果您使用的是自定义错误处理程序(请参阅set_error_handler) E_USER_ERROR 不会停止/退出/死亡,除非错误处理程序返回 false

简而言之:您的自定义错误处理程序有效地确定 E_USER_ERROR 是否被视为致命错误

【讨论】:

非常正确。正如我在另一个地方所指出的,您可以通过以下方式创建一个致命错误: if($isTestMode==1) eval("noSuchFunction();"); 此方法将始终有效。 谢谢布拉德这真的帮助了我,我正在使用自定义错误处理函数。虽然它是“处理错误”,但我使用标志 E_USER_ERROR 触发了它并没有导致“致命”错误,直到我从错误处理函数返回 false。【参考方案3】:
debug_print_backtrace();
trigger_error("As much information as you can provide, please", E_USER_ERROR);
exit();

exit() 完全终止 PHP 脚本。您可以向用户或开发人员提供有关错误的信息越多越好。错误代码已过时。

编辑:使用 E_USER_ERROR 应该会终止脚本,因此将 debug_print_backtrace() 移到 trigger_error() 之前。

【讨论】:

绝对,添加模具;或退出;抛出此类错误后的命令是几乎 100% 确定的唯一方法。摆脱它的唯一方法(期望 php.ini 禁用功能)是runkit_function_remove【参考方案4】:

如果您使用的是 PHP 7 或更高版本,Error 类也可以:

$flag = false;

try 
    if ($flag == false) 
        throw new Error('An error occured');
    
 catch (Error $e) 
    echo $e->getMessage();

如果你把throw new Error('An error occured'); 放在Try Catch 之外,你会得到一个致命错误。

【讨论】:

以上是关于PHP:触发致命错误?的主要内容,如果未能解决你的问题,请参考以下文章

php中错误处理

通过findOneBy方法获取的Doctrine实体的行为与通常类似,但会触发致命错误

无法激活插件,因为它触发了致命错误:意外的“require_once”

PHP 异常处理 总出现致命错误 无法捕获异常

如何修复wordpress中的php致命错误和http错误500

PHP:自定义错误处理程序 - 处理解析和致命错误