使用Eval函数时无法捕获异常

时间:2020-02-05 16:27:06

标签: php error-handling

我正在编写代码,该代码为遗传优化目的随机生成遗传算法的表达式。为适应性,对生成的表达式进行了eval编辑。有些表达式会产生错误,我需要能够抓住这些错误并采取适当的行动。

我有以下代码(从原始代码简化):

set_error_handler(function($errno, $errstr, $errfile, $errline, $errcontext) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

$expression = '$y=~!7;';

try {
    eval($expression);
} catch (Exception $e){
    echo 'Expression failed';
} catch (ParseError $e){
    echo 'Expression failed';
}

这将引发以下错误:

PHP Fatal error:  Unsupported operand types in ..... : eval()'d code on line ....

但是在任一catch块中均未捕获到此错误。

我已经设置了自己的错误处理程序,以便将所有错误提升为异常。

如何捕获此错误?

注意:我非常清楚使用eval是危险的,但是在我的代码中严格没有用户输入。

1 个答案:

答案 0 :(得分:0)

至少在PHP 7.1+中,如果所评估的代码生成致命错误,则eval()将终止脚本。例如:

@eval('$content = (100 - );');

(即使它在男人身上,我也要确保它在5.6中的行为如此,但无论如何) 要抓住它,我必须做:

try {
    eval('$content = (100 - );');
} catch (ParseError $e) {
    $content = null;
}

这是我发现捕获错误并隐藏存在错误的唯一方法。