PHP 處理錯誤函數

錯誤級別

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" 代碼塊會捕獲異常,並創建一個包含異常信息的對象。

  1. try catch 捕捉不到fatal error致命錯誤
  2. 只有拋出異常才能被截獲,如果異常拋出了卻沒有被捕捉到,就會產生一個fatal error
  3. 父類可以捕獲子類拋出的異常
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 對象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章