PHP
主要有兩種錯誤:觸發錯誤和異常。其中觸發錯誤大概可以分為:編譯錯誤、引擎錯誤和運作時錯誤,其中前兩個是無法捕獲的;異常都是可以捕獲的,當沒有嘗試捕獲時則會中斷代碼。
觸發錯誤可以通過 <code>error_get_last()</code> 來進行獲得,異常可以使用标準的 <code>try...catch</code> 語句來捕獲。
error_reporting() 函數是 PHP
提供的一個控制錯誤等級的函數,如果設定了對應的錯誤等級,則隻會在對應錯誤等級觸發時才會在頁面(或輸出,對于指令行來說)輸出響應的錯誤資訊。
error_reporting(int level) 支援等級 level
參數使用二進制的數字來配置錯誤等級,錯誤等級一般用常量來代替對應的二進制辨別。例如:E_ALL、E_NOTICE、 E_USER_NOTICE
等等;如果不傳遞參數,則會傳回目前的錯誤等級(一般用來儲存目前的錯誤等級以供後續恢複)。
其中 E_PARSE、E_COMPILE_* 和 E_CORE_* 是非運作時錯誤,無法被捕獲的
配置檔案是 PHP
初始化的<code>預設</code>配置,通過修改某些參數可以控制對應的初始化參數。如果要控制錯誤,可以通過以下幾個方式來配置:
display_errors - 是否顯示錯誤,一般在生産環境建議關閉該參數并和下列的參數一起試用 log_errors -
記錄錯誤開關,如果打開會記錄到對應位置 error_log - 記錄錯誤日志的位置,不指定為系統預設 error_reporting - 同上面的函數
提供了一種特殊的操作,通過在語句前面加上抑制錯誤操作符<code>@</code>來抑制該語句出現錯誤。這種情況通常用于你不知道會發生什麼情況下使用,比如打開了不确定的檔案或者網絡
URL,但一般不推薦使用
抑制錯誤本身内部做了一系列的處理才達到該效果,并且對于錯誤本身完全是未知的,一般情況下,不建議這麼使用
幾乎在所有語言中,都會有對于異常的處理。如果程式抛出一個異常,那麼可以通過 try…catch
語句來捕獲該異常,如果明确知道錯誤的類型,也可以隻捕獲該類型的錯誤。try…catch 是一種最标準的錯誤處理方式
PHP 提供了 set_error_handler() 函數來讓開發者傳入一個函數名(或匿名函數,對于 5.2 以上的
PHP)就可以讓所有的錯誤進入該函數,然後開發者可以在函數内進行控制,舉例說明
對應地,PHP 也提供了 restore_error_handler() 來恢複為标準的 PHP 錯誤控制。
如果每個異常都去捕獲,顯然是很複雜的事情,需要編寫很多代碼,而且維護起來會比較複雜,對于一個快速程式設計的語言來說,PHP 自然不會允許發生這種事情。使用
set_exception_handler()
就可以像上面錯誤處理控制器一樣接收所有未捕獲的異常,然後做一些該做的事情,甚至還可以再把錯誤抛出來。例如:
該類處理并非 PHP 标準的處理方式,但對于某種使程式崩潰的無法捕獲的錯誤确實很有用,它是指注冊一個 shutdown 函數,在函數内通過調用
error_get_last() 來擷取最後的錯誤,并且根據錯誤等級來做相應的處理。