我理解“致命错误”这个词的意义,但我想写一个像这样的测试类(令人作呕的简化):
class tester {
function execute() {
if( @$this->tryit() === true ) return true;
return false;
}
function tryit() {
$doesntexist = new noobject();
return true;
}
}
实际上我有一个Test
父类,然后类会扩展它并包含一堆带有大量测试的方法。父类将定义execute
,它将只运行子类中的每个方法(当然不包括execute
)并收集哪些函数通过哪些失败的数据。
我想在实际编写部分代码之前编写测试,但不是使用assert
我只想运行每个测试并生成一个列表,其中包含哪些测试函数班级失败。但这意味着如果测试失败则意味着存在错误 - 但我也想处理我忘记定义类等的实例。是否可以这样做,而不是让整个脚本死掉?
我原以为脚本只会失败,直到函数调用前面有@
,然后继续,但显然我错了。有解决方法吗?
答案 0 :(得分:7)
致命错误致命,你无能为力。
解决方案的两个想法可能是:
method_exists
实际上,第二个解决方案存在于版本3.4的PHPUnit中,如果我没记错的话; - )
答案 1 :(得分:2)
致命错误无法停止,即使使用set_error_handler
也是如此。但是,您通常可以通过编写更多代码来找到另一种方法。对于示例方法tryit
,您可以编写一个触发非致命错误的autoload函数或(在PHP 5.3.0中)抛出异常,或使用class_exists
跳过实例化一个不存在的阶级。
答案 2 :(得分:2)
你不能写它,以便代码在致命之后从它停止的地方开始。但是,您可以使用register_shutdown_function()在致命错误后继续处理php。
我编写的代码可以检查它是什么类型的致命错误,然后尝试修复它,然后再将用户重定向到同一页面,或者死亡。
register_shutdown_function非常适合将用户重定向到500错误页面,其中联系表单预先设置了错误信息。通过这种方式,我可以让用户通过在我的github帐户上打开一个问题来帮助我。
答案 3 :(得分:1)
我猜你会设置一个带有set_error_handler()
函数的错误处理程序,它调用你的测试类来报告错误,但我不完全确定你是如何实现它的。
答案 4 :(得分:0)
使用PHP 7,您现在可以尝试/捕获致命错误。