PHP 核心知識點(一)異常和錯誤處理

一句話兒發表於2020-02-27
示例:
    $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('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
        }
    }
    //註冊異常處理函式, 沒有捕獲處理的異常,將統一再這裡處理
    set_exception_handler('myException');
    function myException($exception)
    {
        var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage()  . '</b>');
    }
    //註冊錯誤處理函式
    set_error_handler('myError');
    function myError($type, $message, $file, $line)
    {
        //var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />');
        throw new Exception($message);
    }
捕獲所有錯誤的原理

由set_error_handler()可知,他能夠捕獲一部分錯誤,不能捕獲系統級E_ERROR、E_PARSE等錯誤,但是這部分可以由register_shutdown_function()捕獲。所以兩者結合能出現很好的功能。

三個函式實現自動捕獲異常和錯誤

  1. set_error_handler() 只能夠捕獲部分錯誤
  2. register_shutdown_function() 結合set_error_handler()函式,能捕獲所有錯誤
  3. set_exception_handler() 用於捕獲異常
  4. error_get_last() 最後終止錯誤資訊
  5. 在捕獲錯誤的函式中,再手動丟擲異常,即實現set_exception_handler能夠捕獲錯誤。

文章借鑑部落格https://www.cnblogs.com/init-007/p/1124281...

本作品採用《CC 協議》,轉載必須註明作者和本文連結
寫的不好,就當是整理下思緒吧。

相關文章