天天看點

PHP捕獲eval當中的文法錯誤和系統錯誤的方法

作者:同福程式設計

1. 介紹

1.1 介紹

福哥在使用PHP開發一個允許使用者輸入僞代碼實作自定義業務邏輯的功能時候,想到了使用PHP的eval功能動态解析PHP代碼并且執行來實作。

不過,福哥發現了一個問題。大家都知道PHP的文法錯誤是在解析PHP代碼的環節就會觸發的嚴重錯誤,這個錯誤無法通過set_error_handler鈎住它進行自定義處理,這個可能難壞了我了!畢竟,使用者輸入的僞代碼可保不齊會有低級的文法錯誤啊~~

2. 解決

經過一番研究後發現,原來eval可以通過try .. catch來捕獲它的錯誤。

2.1 全部錯誤

需要注意的是eval必須用Error異常才可以捕獲錯誤,包括文法錯誤或者執行錯誤都可以捕獲到。

PHP捕獲eval當中的文法錯誤和系統錯誤的方法

2.2 文法錯誤和執行錯誤

如果需要單獨判斷文法錯誤的話,可以換成ParseError異常。然後下面再補一個Error異常捕獲執行錯誤。

PHP捕獲eval當中的文法錯誤和系統錯誤的方法

2.3 完整示例

下面福哥給一個完整的示例代碼。

2.3.1 文法錯誤

try{
    // 福哥寫了一個沒有關閉括号的函數調用,這裡屬于文法錯誤了
    eval('call_tongfu_net(');
}
catch (ParseError $e){
    print("文法錯誤: ". $e->getMessage());
}
catch (Error $e){
    print("執行錯誤: ". $e->getMessage());
}           
PHP捕獲eval當中的文法錯誤和系統錯誤的方法

2.3.2 執行錯誤

try{
    // 福哥寫了一個不存在的函數調用,肯定會報執行錯誤的
    eval('call_tongfu_net();');
}
catch (ParseError $e){
    print("文法錯誤: ". $e->getMessage());
}
catch (Error $e){
    print("執行錯誤: ". $e->getMessage());
}           
PHP捕獲eval當中的文法錯誤和系統錯誤的方法

https://tongfu.net/home/35/blog/513659.html

繼續閱讀