PHP捕获eval当中的语法错误和系统错误的方法
1. 介绍
1.1 介绍
福哥在使用PHP开发一个允许用户输入伪代码实现自定义业务逻辑的功能时候,想到了使用PHP的eval功能动态解析PHP代码并且执行来实现。
不过,福哥发现了一个问题。大家都知道PHP的语法错误是在解析PHP代码的环节就会触发的严重错误,这个错误无法通过set_error_handler钩住它进行自定义处理,这个可能难坏了我了!毕竟,用户输入的伪代码可保不齐会有低级的语法错误啊~~
2. 解决
经过一番研究后发现,原来eval可以通过try .. catch来捕获它的错误。
2.1 全部错误
需要注意的是eval必须用Error异常才可以捕获错误,包括语法错误或者执行错误都可以捕获到。

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

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

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