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());
}
https://tongfu.net/home/35/blog/513659.html