介绍
介绍
福哥在使用PHP开发一个允许用户输入伪代码实现自定义业务逻辑的功能时候,想到了使用PHP的eval功能动态解析PHP代码并且执行来实现。
不过,福哥发现了一个问题。大家都知道PHP的语法错误是在解析PHP代码的环节就会触发的严重错误,这个错误无法通过set_error_handler钩住它进行自定义处理,这个可能难坏了我了!毕竟,用户输入的伪代码可保不齐会有低级的语法错误啊~~
解决
经过一番研究后发现,原来eval可以通过try .. catch来捕获它的错误。
全部错误
需要注意的是eval必须用Error异常才可以捕获错误,包括语法错误或者执行错误都可以捕获到。
语法错误和执行错误
如果需要单独判断语法错误的话,可以换成ParseError异常。然后下面再补一个Error异常捕获执行错误。
完整示例
下面福哥给一个完整的示例代码。
语法错误
try{ // 福哥写了一个没有关闭括号的函数调用,这里属于语法错误了 eval('call_tongfu_net('); } catch (ParseError $e){ print("语法错误: ". $e->getMessage()); } catch (Error $e){ print("执行错误: ". $e->getMessage()); }
执行错误
try{ // 福哥写了一个不存在的函数调用,肯定会报执行错误的 eval('call_tongfu_net();'); } catch (ParseError $e){ print("语法错误: ". $e->getMessage()); } catch (Error $e){ print("执行错误: ". $e->getMessage()); }