溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP的異常與錯誤處理

發布時間:2020-06-09 09:41:59 來源:億速云 閱讀:257 作者:Leah 欄目:編程語言

這篇文章給大家分享的是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('<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 () 捕獲。所以兩者結合能出現很好的功能。

小結

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

set_error_handler () 只能夠捕獲部分錯誤

register_shutdown_function () 結合 set_error_handler () 函數,能捕獲所有錯誤

set_exception_handler () 用于捕獲異常

error_get_last () 最后終止錯誤信息

在捕獲錯誤的函數中,再手動拋出異常,即實現 set_exception_handler 能夠捕獲錯誤。

如果你能讀到這里,恭喜你已經對PHP的異常與錯誤處理有了從實踐層面最深刻的體會了。如果想閱讀更多相關內容的文章,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女