我正在编写代码,该代码为遗传优化目的随机生成遗传算法的表达式。为适应性,对生成的表达式进行了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
是危险的,但是在我的代码中严格没有用户输入。
答案 0 :(得分:0)
至少在PHP 7.1+中,如果所评估的代码生成致命错误,则eval()将终止脚本。例如:
@eval('$content = (100 - );');
(即使它在男人身上,我也要确保它在5.6中的行为如此,但无论如何) 要抓住它,我必须做:
try {
eval('$content = (100 - );');
} catch (ParseError $e) {
$content = null;
}
这是我发现捕获错误并隐藏存在错误的唯一方法。