是否可以忽略PHP中的致命错误?

时间:2009-12-18 04:59:06

标签: php unit-testing error-handling

我理解“致命错误”这个词的意义,但我想写一个像这样的测试类(令人作呕的简化):

class tester {

    function execute() {

        if( @$this->tryit() === true ) return true;
        return false;

    }

    function tryit() {

        $doesntexist = new noobject();
        return true;

    }

}

实际上我有一个Test父类,然后类会扩展它并包含一堆带有大量测试的方法。父类将定义execute,它将只运行子类中的每个方法(当然不包括execute)并收集哪些函数通过哪些失败的数据。

我想在实际编写部分代码之前编写测试,但不是使用assert我只想运行每个测试并生成一个列表,其中包含哪些测试函数班级失败。但这意味着如果测试失败则意味着存在错误 - 但我也想处理我忘记定义类等的实例。是否可以这样做,而不是让整个脚本死掉?

我原以为脚本只会失败,直到函数调用前面有@,然后继续,但显然我错了。有解决方法吗?

5 个答案:

答案 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,您现在可以尝试/捕获致命错误。

https://www.php.net/manual/en/language.exceptions.php