PHP捕获eval当中的语法错误和系统错误的方法【20220209】

发表于 2021-12-30 16:50:22
阅读 92

介绍

介绍

福哥在使用PHP开发一个允许用户输入伪代码实现自定义业务逻辑的功能时候,想到了使用PHP的eval功能动态解析PHP代码并且执行来实现。

不过,福哥发现了一个问题。大家都知道PHP的语法错误是在解析PHP代码的环节就会触发的严重错误,这个错误无法通过set_error_handler钩住它进行自定义处理,这个可能难坏了我了!毕竟,用户输入的伪代码可保不齐会有低级的语法错误啊~~

解决

经过一番研究后发现,原来eval可以通过try .. catch来捕获它的错误。

全部错误

需要注意的是eval必须用Error异常才可以捕获错误,包括语法错误或者执行错误都可以捕获到。

home/topic/2022/0210/10/10363eda77337ed8f556a6a1d1744d25.png

语法错误和执行错误

如果需要单独判断语法错误的话,可以换成ParseError异常。然后下面再补一个Error异常捕获执行错误。

home/topic/2022/0210/10/6eda57f3e082e074e6131526132ab364.png

完整示例

下面福哥给一个完整的示例代码。

语法错误

try{
    // 福哥写了一个没有关闭括号的函数调用,这里属于语法错误了
    eval('call_tongfu_net(');
}
catch (ParseError $e){
    print("语法错误: ". $e->getMessage());
}
catch (Error $e){
    print("执行错误: ". $e->getMessage());
}

home/topic/2022/0210/10/430287bbcd3fc569e0581fda052595bf.png

执行错误

try{
    // 福哥写了一个不存在的函数调用,肯定会报执行错误的
    eval('call_tongfu_net();');
}
catch (ParseError $e){
    print("语法错误: ". $e->getMessage());
}
catch (Error $e){
    print("执行错误: ". $e->getMessage());
}

home/topic/2022/0210/10/339c2d7d50a51c25781bdb9773b3b776.png