這一章節主要要介紹的是 PHP 的錯誤(???
是錯誤控管與回報才對!
這個章節可以和下一章 Exceptions 合併來觀看
在這一章節提到的部分內容都會在下一章節有更詳細的介紹~
主要會分成兩個部分來介紹
- basic
- try catch
- set_error_handler
第一個部分主要會介紹到 PHP 錯誤回報層級以及相對應的設定檔..等等
而第二個部分則是會介紹如何使用 try catch 去偵錯~
1. basic
PHP 有提供以下的錯誤回報種類,依據設定不同的層級,會回報對應的錯誤訊息
回報層級 | 介紹 |
---|---|
E_ALL | 所有的錯誤和警告 |
E_ERROR | 致命的執行錯誤(中斷程式碼) |
E_WARNING | 執行警告(不會中斷程式碼) |
E_PARSE | 編譯解析錯誤 |
E_NOTICE | 執行提醒(bug) |
E_CORE_ERROR | 初始化PHP的致命錯誤 |
E_CORE_WARNING | 初始化PHP的執行警告 |
E_COMPILE_ERROR | 編譯程式碼的致命錯誤 |
E_COMPILE_WARNING | 編譯程式碼的執行警告 |
E_USER_ERROR | 使用者產生的致命錯誤 |
E_USER_WARNING | 使用者產生的執行警告 |
E_USER_NOTICE | 使用者產生的執行提醒 |
可以到 php.ini 檔案中設定 error_reporting 去改變回報的錯誤層級
一般在開發的時候會建議設定成 E_ALL 比較方便 debug
另外也有以下相關的指令可以使用
指令 | 介紹 |
---|---|
display_errors | 列印出錯誤訊息 |
log_errors | 將錯誤訊息記錄到 error_log 或 syslog 中 |
set_error_handler | 自定義錯誤回報訊息 |
一般常見的還可以使用 var_dump 將變數列印出來檢查是否有符合預期~
2. try catch
在 PHP 5 之後有提供錯誤處理方法
也就是 try catch 的語法,而它的功用和其他程式語言是相同的
當有異常發生在 try 的區塊裡的時候,會到 catch 限定的異常類型進行比對
如果有符合的異常類型,則會根據裡面的程式碼進行異常處理
反過來說!
如果在 catch 的區塊中都沒有符合的異常類型,也沒有使用 set_exception_handler 進行自定義錯誤處理的話
就會讓程式碼中斷執行!
finally
而 try catch 還可以和 finally 搭配
而他們的執行順序是
- 先執行 try 的範疇
- 若有發生異常則到 catch 的範疇檢查是否有對應處理的區塊
- 若沒有對應的 catch 區塊則中斷程式碼執行;
若有對應的 catch 區塊,則在執行完 catch 區塊後執行 finally 區塊
也就是說 try 和 finally 的範疇都一定會被執行到~
也只有對應的 catch 區塊才會被執行到!
1 | try{ |
throw
除了執行錯誤發生的異常之外
也可以在 try 區塊中使用 throw 關鍵字,自行拋出異常,讓程式碼進行 catch 的後續處理~
1 | try{ |
範例所使用的都是 Exception 類別
會抓住所有得異常類型進行處理
實際上可以針對特定的異常類行進行抓取,也可以使用多個 catch 同時對多種異常類行進行處理~
對應 debug 或是容易發生異常的程式碼區塊,是相當方便的~
3. set_error_handler
這部分要介紹自定義錯誤訊息的處理
主要是針對使用者在操作時,程式碼所發出的錯誤,比如未判斷傳入參數型態,導致後續函式有問題…等等
set_error_handler 可傳入兩個參數,分別是
- errorhandler: 處理錯誤的函式名稱
- error_types: 錯誤回報層級,預設值為 E_ALL (可參考本章第一小節)
在使用上可以搭配 trigger_error 函式進行測試
而有一點特別需要注意的是!!!
在使用 set_error_handler 函式的情況下,會跳過 PHP 預設的標準錯誤處理程序
這也是很重要的一點~
當有發生錯誤的時候, PHP 會將發生的錯誤路徑以及執行順序顯示在畫面上
這對 debug 來說相當方便,但萬一被有心人藉用這種方法去了解專案的實際路徑的話,是相當危險的一件事
當然在實際上線佈署的時候也可以採用將 display_errors 設定為 off 的方式去避免這個問題
不過現在你之到有另一種選擇啦~ 就是使用 set_error_handler ~
1 | function customErrorHandler() { |