代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

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

  •  2
  • Carson Myers  · 技术社区  · 15 年前

    我理解术语“致命错误”的意义,但我想编写这样的测试类(令人厌恶的简化):

    class tester {
    
        function execute() {
    
            if( @$this->tryit() === true ) return true;
            return false;
    
        }
    
        function tryit() {
    
            $doesntexist = new noobject();
            return true;
    
        }
    
    }
    

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

    我想在实际编写部分代码之前编写测试,但不使用 assert 我只想跑 每一个 测试并生成测试类失败的函数列表。但这意味着如果一个测试失败了,就意味着有一个错误——但我还想处理那些我忘记定义类等的实例。在没有整个脚本死亡的情况下,是否可以这样做?

    我在想,在函数调用 @ 在它前面,然后继续,但显然我错了。有解决办法吗?

    4 回复  |  直到 12 年前
        1
  •  7
  •   Peter Lang    12 年前

    致命错误是 致命的 你对此无能为力。

    有两种解决方案可以是:

    • 在尝试调用方法之前测试该方法是否存在;请参见 method_exists
    • 或者,在单独的进程中运行每个“测试”:这样,如果一个测试导致致命错误,则只有与该测试对应的“子”进程会死亡,“父”进程(测试启动程序)可以检测到该错误并将其视为失败。

    实际上,第二个解决方案存在于 PHPUnit 从3.4版开始,如果我没记错的话;-)

        2
  •  2
  •   outis    15 年前

    无法停止致命错误,即使 set_error_handler . 但是,您通常可以找到另一种方法,代价是编写更多的代码。对于示例方法 tryit ,你可以写一个 autoload 函数触发非致命错误或(在php 5.3.0中)引发异常,或使用 class_exists 跳过不存在类的实例化。

        3
  •  2
  •   Enterprise Architect    12 年前

    是与否

    你不能写它,这样代码就可以在致命事故发生后从停止的地方恢复。但是,在出现致命错误后,可以使用register_shutdown_function()继续处理PHP。

    我已经编写了代码来检查它是哪种致命错误,然后在将用户重定向回同一个页面或死亡之前尝试修复它。

    register_shutdown_功能非常适合将用户重定向到500个错误页面,其中以错误信息为准的联系人表单。这样我就可以让用户在我的Github帐户上打开一个问题来帮助我。

        4
  •  1
  •   Daniel Bruce    15 年前

    我猜你会用 set_error_handler() 调用到测试类中以报告错误的函数,但我不完全确定如何实现它。