首頁  >  文章  >  後端開發  >  直擊PHP的異常與錯誤處理

直擊PHP的異常與錯誤處理

coldplay.xixi
coldplay.xixi轉載
2020-06-06 15:37:522582瀏覽


直擊PHP的異常與錯誤處理

#異常與錯誤

範例:

  $num = 0;
    try {
        echo 1/$num;
    } catch (Exception $e){
        echo $e->getMessage();//并不能执行到这里
    }
    //说明try{}catch{}是用于捕获异常的,而错误是不能捕获到的。
 
    //手动抛出异常进行捕获
    $num = 0;
    try {
        if($num == 0){
            //通过if判断可以处理错误,手动抛出异常(如何实现自动捕获错误呢,需结合三个php内置函数)
            throw new Exception('除数为零');
        }
        echo 1/$num;
    } catch (Exception $e){
        echo $e->getMessage();
    }

什麼是異常

程式在運行中出現不符合預期的情況,允許發生(你也不想讓他出現不正常的情況)但他是一種不正常的情況,按照我們的正常邏輯本不該出的錯誤,但仍會出現的錯誤,屬於邏輯和業務流程的錯誤,而不是編譯或語法上的錯誤。

 

什麼是錯誤

屬於php 腳本本身的問題,大部分情況是由錯誤的語法,伺服器環境導致,使得編譯器無法通過檢查,甚至無法運作的情況。 warning、notice 都是錯誤,只是他們的等級不同而已,而且錯誤是不能被try-catch 捕獲的

 

##錯誤的分類

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 // 使用者產生的通知訊息。

5 類別是產生 ERROR 等級的錯誤,這種錯誤直接導致 PHP 程式退出。分別是ERROR = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_PARSE

##如何實作擷取錯誤

## 實作用try {} catch (Exception $ e){} 捕捉異常的方式,來捕捉錯誤,需使用三個函數

// 注册一个会在php中止时执行的函数
    register_shutdown_function('myShutdownFunction');
    function myShutdownFunction()
    {
        if ($error = error_get_last()) {
            var_dump(&#39;<b>register_shutdown_function: Type:&#39; . $error[&#39;type&#39;] . &#39; Msg: &#39; . $error[&#39;message&#39;] . &#39; in &#39; . $error[&#39;file&#39;] . &#39; on line &#39; . $error[&#39;line&#39;] . &#39;</b>&#39;);
        }
    }
//注册异常处理函数, 没有捕获处理的异常,将统一再这里处理
    set_exception_handler(&#39;myException&#39;);
    function myException($exception)
    {
        var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage()  . &#39;</b>&#39;);
    }

 

 //注册错误处理函数
    set_error_handler(&#39;myError&#39;);
    function myError($type, $message, $file, $line)
    {
        //var_dump(&#39;<b>set_error_handler: &#39; . $type . &#39;:&#39; . $message . &#39; in &#39; . $file . &#39; on &#39; . $line . &#39; line .</b><br />&#39;);
        throw new Exception($message);
    }


##捕獲所有錯誤的原則

由set_error_handler () 可知,他能夠捕獲一部分錯誤,不能捕獲系統級E_ERROR、E_PARSE 等錯誤,但是這部分可以由register_shutdown_function () 捕獲。所以兩者結合能出現很好的功能。 ###### #########小結#########三個函數實作自動擷取例外與錯誤#########set_error_handler () 只能夠捕捉部分錯誤######register_shutdown_function () 結合set_error_handler () 函數,能捕獲所有錯誤######set_exception_handler () 用於捕獲異常######error_get_last () 最後終止錯誤訊息#### ##在捕獲錯誤的函數中,再手動拋出異常,即實作set_exception_handler 能夠捕獲錯誤。 #########推薦教學:《###PHP影片教學###》###

以上是直擊PHP的異常與錯誤處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除