PHP:如何触发致命错误?

38

我希望能够在我的PHP类中抛出致命的、无法捕获的错误,当我的类的用户滥用它以外的东西时。我不希望他们能够用catch语句恢复。

我知道trigger_error,但我只能让它发出警告或通知。


1
为什么要费心呢?无论谁在实现你的类:1.都是程序员。2.都可以访问源代码。3.都可以并且很可能会删除trigger_error()调用。 - Sammitch
2
@Sammitch:我想表达我的意图。我想让使用我的代码的人知道,他们所做的不是我预期的用法。对我来说,抛出异常传递了这样一条信息:“你处理这个未定义的行为。”我想传递的信息是:“不要那样做,而应该这样做”。 - DudeOnRock
2
示例库。例如,在某些条件不成立时,您绝对不应该执行某些操作。(这对那些不喜欢阅读文档的人很有用 :P) - bwoebi
@bwoebi:完全是我的情况;-) - DudeOnRock
我意识到这是一个七年前的问题,但即使如此,仍然可能会有人遇到它。你提出的异常发送消息给程序员处理未定义行为的想法是完全错误的。这不是异常的含义。唯一的方法是当程序员对编程一无所知或做出随意和荒谬的假设时,他们才会认为这是正确的。异常只是更加简洁。另外触发错误并不意味着他们不能从中恢复。他们仍然可以使用类似于异常处理的错误处理方式。 - still_dreaming_1
5个回答

61

E_USER_ERROR是相应的常量。

trigger_error("Fatal error", E_USER_ERROR);

请参考手册页面的第一个示例以及PHP错误列表(只有以E_USER*开头的错误才可以从trigger_error中发出)。


7
非常讽刺的是,那个说“适合不喜欢阅读文档的人”的家伙却没费心去阅读手册页面的第一个例子。 - Arthur Chaparyan

14
注意:如果您正在使用自定义的错误处理程序(参见set_error_handler),则E_USER_ERROR不会停止/退出/终止,除非错误处理程序返回false。
简而言之:您的自定义错误处理程序实际上确定了如何处理E_USER_ERROR

2
非常正确。正如我在另一个地方所指出的那样,您可以通过以下方式创建致命错误:if($isTestMode==1){ eval("noSuchFunction();"); }这种方法总是有效的。 - Steve Horvath
1
谢谢Brad,这真的帮了我很多。我正在使用自定义错误处理程序函数。虽然它正在“处理”我用E_USER_ERROR标志触发的错误,但直到我从我的错误处理程序函数中返回false时,它才会导致“致命”错误。 - dading84

7
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()之前。


抛出此类错误后,添加die;或exit;命令是几乎100%确定的唯一方法。除非php.ini禁用函数,否则唯一逃脱它的方法是runkit_function_remove - Gall Annonim

2
如果您使用的是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之外,你会得到一个致命错误。

0

我只是试图破坏我们的接受环境,偶然发现了一种简单而好用的方法来引发一个致命错误

只需调用不存在的函数即可。 如此处所建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接