Php 如何抓住一个“机会”;未定义索引“;注意simpleTest中的错误?

Php 如何抓住一个“机会”;未定义索引“;注意simpleTest中的错误?,php,exception,simpletest,Php,Exception,Simpletest,我想使用simpleTest编写一个测试,如果我正在测试的方法导致PHPE_NOTICE“undefined index:foo”,那么该测试将失败 我尝试了expectError()和expectException()但没有成功。simpleTest网页表明simpleTest无法捕获编译时PHP错误,但是E_注意似乎是一个运行时错误 有没有办法捕捉到这样一个错误并使我的测试失败呢?这真的很不容易,但我最终设法捕捉到了我想要的E\u注意事项错误。我需要重写当前的error\u处理程序,以抛出一

我想使用simpleTest编写一个测试,如果我正在测试的方法导致PHP
E_NOTICE
“undefined index:foo”,那么该测试将失败

我尝试了
expectError()
expectException()
但没有成功。simpleTest网页表明simpleTest无法捕获编译时PHP错误,但是
E_注意
似乎是一个运行时错误


有没有办法捕捉到这样一个错误并使我的测试失败呢?

这真的很不容易,但我最终设法捕捉到了我想要的
E\u注意事项
错误。我需要重写当前的
error\u处理程序
,以抛出一个异常,我将在
try{}
语句中捕获该异常

function testGotUndefinedIndex() {
    // Overriding the error handler
    function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
        // We are only interested in one kind of error
        if ($errstr=='Undefined index: bar') {
            //We throw an exception that will be catched in the test
            throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
        }
        return false;
    }
    set_error_handler("errorHandlerCatchUndefinedIndex");

    try {
        // triggering the error
        $foo = array();
        echo $foo['bar'];
    } catch (ErrorException $e) {
        // Very important : restoring the previous error handler
        restore_error_handler();
        // Manually asserting that the test fails
        $this->fail();
        return;
    }

    // Very important : restoring the previous error handler
    restore_error_handler();
    // Manually asserting that the test succeed
    $this->pass();
}

这似乎有点过于复杂,需要重新声明错误处理程序来抛出异常以捕获它。另一个困难的部分是在捕获异常且未发生错误时正确还原错误处理程序,否则它只会干扰SimpleTest错误处理。

实际上不需要捕获通知错误。还可以测试“array\u key\u exists”的结果,然后从那里开始


测试false并使其失败。

您永远无法在try-catch块中捕获它,幸运的是我们设置了\u error\u handler():


那是多么糟糕的语言啊!如果您提供E_NOTICE作为设置_error_handler的第二个参数,它将只处理通知。“可用于屏蔽错误处理程序函数的触发,就像错误报告ini设置控制显示哪些错误一样。如果没有此屏蔽设置,则无论错误报告设置的设置如何,都将为每个错误调用错误处理程序。”如果向下投票,请解释原因。当您将一个数组投影到另一个数组时,会出现这种情况。您不想对每个单独的映射进行测试,而是希望捕获任何一个映射失败的情况。如果有例外,这会容易得多。最好的答案其实很简单而且有效,不确定为什么它没有投票权。。。但是我的
<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>
function myErrorHandler($errno, $errstr, $errfile, $errline)