为了账号安全,请及时绑定邮箱和手机立即绑定

如何捕获 php eval() 中的解析错误?

如何捕获 php eval() 中的解析错误?

PHP
撒科打诨 2023-09-22 16:54:16
我想使用 php eval() 来识别潜在的解析错误。我知道评估的危险,但这是一个非常有限的用途,将事先进行充分验证。我相信在 php 7 中我们应该能够捕获解析错误,但它不起作用。这是一个例子:  $one = "hello";  $two = " world";  $three = '';  $cmdstr = '$three = $one . $tw;';  try {     $result = eval($cmdstr); } catch (ParseError $e) {     echo 'error: ' . $e; }echo $three;我试图在此处引发解析错误,看看是否可以捕获它,但是当我运行它时,错误(未定义的变量 tw)会像通常那样出现。它没有被抓住。有什么想法如何从 eval 捕获解析错误吗?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您的代码无法按预期工作,因为在 PHP 中,未定义的变量不会触发解析错误,而是会触发通知。感谢set_error_handler本机函数,您可以将通知转换为错误,然后使用以下 PHP 7 代码捕获它:

<?php


set_error_handler(function($_errno, $errstr) {

    // Convert notice, warning, etc. to error.

    throw new Error($errstr);

});


$one = "hello";

$two = " world";

$three = '';

$cmdstr = '$three = $one . $tw;';


try {

    $result = eval($cmdstr);

} catch (Throwable $e) {

    echo $e; // Error: Undefined variable: tw...

}


echo $three;


查看完整回答
反对 回复 2023-09-22
?
largeQ

TA贡献2039条经验 获得超7个赞

您的 PHP 代码会抛出“Notice”类型的错误,并且这些错误无法由 try..catch 块处理。您必须使用 PHP 的set_error_handler方法来使用自己的错误处理程序。阅读该文档,您就会明白该怎么做。如果您想要一个如何操作的示例,那么:


<?php


function myErrorHandler($errno, $errstr)

{

    switch ($errno) {

        case E_USER_ERROR:

            die("User Error");

            break;

        default:

            die("Your own error");

            break;

    }


    /* Don't execute PHP internal error handler */

    return true;

}


$err = set_error_handler("myErrorhandler");


$one = "hello";

$two = " world";

$three = '';

$cmdstr = '$three = $one . $tw;';


$result = eval($cmdstr);


echo $three;


?>


查看完整回答
反对 回复 2023-09-22
  • 2 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信