溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP的異常與錯(cuò)誤處理

發(fā)布時(shí)間:2020-06-09 09:41:59 來源:億速云 閱讀:219 作者:Leah 欄目:編程語言

這篇文章給大家分享的是PHP的異常與錯(cuò)誤處理。小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí)。如下資料是關(guān)于設(shè)置環(huán)境變量的內(nèi)容。

異常和錯(cuò)誤

示例:

  $num = 0;
    try {
        echo 1/$num;
    } catch (Exception $e){
        echo $e->getMessage();//并不能執(zhí)行到這里
    }
    //說明try{}catch{}是用于捕獲異常的,而錯(cuò)誤是不能捕獲到的。
 
    //手動(dòng)拋出異常進(jìn)行捕獲
    $num = 0;
    try {
        if($num == 0){
            //通過if判斷可以處理錯(cuò)誤,手動(dòng)拋出異常(如何實(shí)現(xiàn)自動(dòng)捕獲錯(cuò)誤呢,需結(jié)合三個(gè)php內(nèi)置函數(shù))
            throw new Exception('除數(shù)為零');
        }
        echo 1/$num;
    } catch (Exception $e){
        echo $e->getMessage();
    }

什么是異常

程序在運(yùn)行中出現(xiàn)不符合預(yù)期的情況,允許發(fā)生(你也不想讓他出現(xiàn)不正常的情況)但他是一種不正常的情況,按照我們的正常邏輯本不該出的錯(cuò)誤,但仍然會(huì)出現(xiàn)的錯(cuò)誤,屬于邏輯和業(yè)務(wù)流程的錯(cuò)誤,而不是編譯或者語法上的錯(cuò)誤。

什么是錯(cuò)誤

屬于 php 腳本自身的問題,大部分情況是由錯(cuò)誤的語法,服務(wù)器環(huán)境導(dǎo)致,使得編譯器無法通過檢查,甚至無法運(yùn)行的情況。warning、notice 都是錯(cuò)誤,只是他們的級(jí)別不同而已,并且錯(cuò)誤是不能被 try-catch 捕獲的

錯(cuò)誤的分類

Fatal Error: 致命錯(cuò)誤(腳本終止運(yùn)行)

E_ERROR // 致命的運(yùn)行錯(cuò)誤,錯(cuò)誤無法恢復(fù),暫停執(zhí)行腳本

E_CORE_ERROR // PHP 啟動(dòng)時(shí)初始化過程中的致命錯(cuò)誤

E_COMPILE_ERROR // 編譯時(shí)致命性錯(cuò),就像由 Zend 腳本引擎生成了一個(gè) E_ERROR

E_USER_ERROR // 自定義錯(cuò)誤消息。像用 PHP 函數(shù) trigger_error(錯(cuò)誤類型設(shè)置為:E_USER_ERROR)

Parse Error:編譯時(shí)解析錯(cuò)誤,語法錯(cuò)誤(腳本終止運(yùn)行)

E_PARSE // 編譯時(shí)的語法解析錯(cuò)誤

Warning Error:警告錯(cuò)誤(僅給出提示信息,腳本不終止運(yùn)行)

E_WARNING // 運(yùn)行時(shí)警告 (非致命錯(cuò)誤)。

E_CORE_WARNING // PHP 初始化啟動(dòng)過程中發(fā)生的警告 (非致命錯(cuò)誤) 。

E_COMPILE_WARNING // 編譯警告

E_USER_WARNING // 用戶產(chǎn)生的警告信息

Notice Error:通知錯(cuò)誤(僅給出通知信息,腳本不終止運(yùn)行)

E_NOTICE // 運(yùn)行時(shí)通知。表示腳本遇到可能會(huì)表現(xiàn)為錯(cuò)誤的情況.

E_USER_NOTICE // 用戶產(chǎn)生的通知信息。

5 類是產(chǎn)生 ERROR 級(jí)別的錯(cuò)誤,這種錯(cuò)誤直接導(dǎo)致 PHP 程序退出。分別是 ERROR = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_PARSE

如何實(shí)現(xiàn)捕獲錯(cuò)誤

實(shí)現(xiàn)用 try {} catch (Exception $e){} 捕獲異常的方式,來捕獲錯(cuò)誤,需借助三個(gè)函數(shù)

// 注冊(cè)一個(gè)會(huì)在php中止時(shí)執(zhí)行的函數(shù)
    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>');
        }
    }
//注冊(cè)異常處理函數(shù), 沒有捕獲處理的異常,將統(tǒng)一再這里處理
    set_exception_handler('myException');
    function myException($exception)
    {
        var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage()  . '</b>');
    }

 //注冊(cè)錯(cuò)誤處理函數(shù)
    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);
    }


捕獲所有錯(cuò)誤的原理

由 set_error_handler () 可知,他能夠捕獲一部分錯(cuò)誤,不能捕獲系統(tǒng)級(jí) E_ERROR、E_PARSE 等錯(cuò)誤,但是這部分可以由 register_shutdown_function () 捕獲。所以兩者結(jié)合能出現(xiàn)很好的功能。

小結(jié)

三個(gè)函數(shù)實(shí)現(xiàn)自動(dòng)捕獲異常和錯(cuò)誤

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

register_shutdown_function () 結(jié)合 set_error_handler () 函數(shù),能捕獲所有錯(cuò)誤

set_exception_handler () 用于捕獲異常

error_get_last () 最后終止錯(cuò)誤信息

在捕獲錯(cuò)誤的函數(shù)中,再手動(dòng)拋出異常,即實(shí)現(xiàn) set_exception_handler 能夠捕獲錯(cuò)誤。

如果你能讀到這里,恭喜你已經(jīng)對(duì)PHP的異常與錯(cuò)誤處理有了從實(shí)踐層面最深刻的體會(huì)了。如果想閱讀更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI