錯誤級別
Fatal Error:致命錯誤(腳本終止運行) E_ERROR // 致命的運行錯誤,錯誤無法恢復,暫停執行腳本 E_CORE_ERROR // PHP啓動時初始化過程中的致命錯誤 E_COMPILE_ERROR // 編譯時致命性錯,就像由Zend腳本引擎生成了一個E_ERROR E_USER_ERROR // 自定義錯誤消息。像用PHP函數trigger_error(錯誤類型設置爲:E_USER_ERROR) Parse Error:編譯時解析錯誤,語法錯誤(腳本終止運行) E_PARSE //編譯時的語法解析錯誤 Warning Error:警告錯誤(僅給出提示信息,腳本不終止運行) E_WARNING // 運行時警告 (非致命錯誤)。 E_CORE_WARNING // PHP初始化啓動過程中發生的警告 (非致命錯誤) 。 E_COMPILE_WARNING // 編譯警告 E_USER_WARNING // 用戶產生的警告信息 Notice Error:通知錯誤(僅給出通知信息,腳本不終止運行) E_NOTICE // 運行時通知。表示腳本遇到可能會表現爲錯誤的情況. E_USER_NOTICE // 用戶產生的通知信息。
錯誤顯示級別
// 錯誤級別 ERROR = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_PARSE error_reporting(E_ALL);//設置異常錯誤顯示等級0爲禁止錯誤 error_reporting(0);//禁用錯誤報告 error_reporting(E_ERROR | E_WARNING | E_PARSE);//報告運行時錯誤 error_reporting(E_ALL); //報告所有錯誤 error_reporting(E_ALL~E_NOTICE);//除去提醒處理
Try 和 catch
使用異常的函數應該位於 "try" 代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。
"catch" 代碼塊會捕獲異常,並創建一個包含異常信息的對象。
- try catch 捕捉不到fatal error致命錯誤
- 只有拋出異常才能被截獲,如果異常拋出了卻沒有被捕捉到,就會產生一個fatal error
- 父類可以捕獲子類拋出的異常
try{ // 業務代碼 }catch(Exception $e){ // 捕獲異常,輸出錯誤信息 echo 'Message: ' .$e->getMessage(); }
可以自定義異常類,當必須繼承 Exception 類,,捕獲 catch 先寫子類(級別低的),後寫父類(級別高的),try 中可以 嵌套 try{}catch(Exception $e){}
class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = '錯誤行號 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一個合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try{ // 檢測郵箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是個不合法的郵箱地址,拋出異常 throw new customException($email); // throw - 裏規定如何觸發異常。每一個 "throw" 必須對應至少一個 "catch"。 } }catch (customException $e){ //輸出錯誤信息 echo $e->errorMessage(); }catch(Exception $e) { // 多個異常,先捕獲子類的,父類放最後 echo $e->getMessage(); }
PHP異常處理函數
set_error_handler(error_function,error_types)
設置用戶自定義的錯誤處理函數。該函數用於創建運行期間的用戶自己的錯誤處理方法。該函數返回舊的錯誤處理程序,如果失敗則返回 NULL。如果存在該方法,相應的error_reporting()就不能在使用了
error_function(error_level,error_message,error_file,error_line,error_context)
不僅可以接受函數,還可以接受 類的方法(公開的靜態方法 及 公開的非靜態方法 都可以),但需要以 數組形式 傳遞,數組的第一值爲“類名”,第二個參數爲“方法名”
參數說明:
error_level | 必需的。規定用戶自定義的錯誤的錯誤報告級別。必須是值數字。可能的錯誤報告級別詳見下面的表格。 |
error_message | 必需的。規定用戶自定義的錯誤的錯誤消息。 |
error_file | 可選。規定發生錯誤的文件名。 |
error_line | 可選。規定發生錯誤的行號。 |
error_context | 可選。規定指向活躍符號表中發生錯誤的數組。換句話說,error_context 將包含一個說明每個變量引發錯誤的存在範圍的數組。 |
error_level 錯誤報告級別
2 | E_WARNING | 運行時非致命的錯誤。沒有停止執行腳本。 |
8 | E_NOTICE | 運行時的通知。腳本發現可能是一個錯誤,但也可能在正常運行腳本時發生。 |
256 | E_USER_ERROR | 用戶生成的致命錯誤。這就如同由程序員使用 PHP 函數 trigger_error() 生成的 E_ERROR。 |
512 | E_USER_WARNING | 用戶生成的非致命錯誤。這就如同由程序員使用 PHP 函數 trigger_error() 生成的 E_WARNING。 |
1024 | E_USER_NOTICE | 用戶生成的通知。這就如同由程序員使用 PHP 函數 trigger_error() 生成的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕獲的致命錯誤。這就如同一個可以由用戶定義的句柄捕獲的 E_ERROR(見 set_error_handler())。 |
class App{ //error handler function function customError($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:</b> [$errno] $errstr<br />"; echo "Error on line $errline in $errfile<br />"; echo "Ending Script"; die(); } } //set error handler set_error_handler(array("App","customError")); $test=2; //trigger error if ($test > 1) { trigger_error("A custom error has been triggered"); }
register_shutdown_function(callback_function,parameter)
捕獲PHP的錯誤:Fatal Error、Parse Error等,這個方法是PHP腳本執行結束前最後一個調用的函數,比如腳本錯誤、die()、exit、異常、正常結束都會調用。通過這個函數就可以在腳本結束前判斷這次執行是否有錯誤產生,這時就要藉助於一個函數:error_get_last();這個函數可以拿到本次執行產生的所有錯誤。error_get_last();返回的信息:
[type] - 錯誤類型
[message] - 錯誤消息
[file] - 發生錯誤所在的文件
[line] - 發生錯誤所在的行
當前函數要在代碼執行前執行,否則無法調用。函數沒有返回值,如果傳入的callback不是可調用的,那麼將會產生一個 E_WARNING
級別的錯誤。
參數說明:
callback_function
待註冊的中止回調,中止回調是作爲請求的一部分被執行的,因此可以在它們中進行輸出或者讀取輸出緩衝區。
parameter
可以通過傳入額外的參數來將參數傳給中止函數
register_shutdown_function('zyfshutdownfunc'); function zyfshutdownfunc() { if ($error = error_get_last()) { echo '輸出錯誤:<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>'; } }
set_exception_handler(exception_function)
設置默認的異常處理程序,用在沒有用try/catch塊來捕獲的異常,也就是說不管你拋出的異常有沒有人捕獲,如果沒有人捕獲就會進入到該方法中,並且在回調函數調用後異常會中止。返回之前定義的異常處理程序的名稱,或者在錯誤時返回 NULL
。 如果之前沒有定義錯誤處理程序,也會返回 NULL
。
exception_function 參數說明:規定未捕獲的異常發生時調用的函數。該函數必須在調用 set_exception_handler() 函數之前定義。這個異常處理函數需要需要一個參數,即拋出的 exception 對象。