首頁  >  文章  >  後端開發  >  詳解PHP中錯誤與異常及其相關知識

詳解PHP中錯誤與異常及其相關知識

青灯夜游
青灯夜游轉載
2020-07-25 17:32:352397瀏覽

詳解PHP中錯誤與異常及其相關知識

PHP錯誤等級

#Parse error > Fatal Error > Waning > Notice > Deprecated

  • #Deprecated 最低等級的錯誤(不推薦,不建議)
    使用一些過期函數的時候會出現,程式繼續執行

  • #Notice 通知等級的錯誤
    使用一些未定義變數、常數或陣列key沒有加引號的時候會出現,程式繼續執行

  • #Waning 警告等級的錯誤
    程式出問題了,需要修改代碼! ! !程式繼續執行

  • Fatal Error 錯誤等級的錯誤
    程式直接報錯,需要修改程式碼! ! !中斷程式執行,可使用register_shutdown_function()函數在程式終止前觸發一個函數

  • Parse error 語法解析錯誤
    #語法檢查階段報錯,需要修改代碼! ! !中斷程式執行,除了修改ini文件,將錯誤訊息寫到日誌中,什麼也做不了

  • #E_USER_相關的錯誤
    使用者定義的錯誤,使用者手動拋出錯誤,進行自訂錯誤處理

#PHP錯誤相關函數

  • ini_set('display_errors', 0); //關閉錯誤輸出(開發環境開啟,生產環境關閉)

  • error_reporting(E_ALL&~E_NOTICE); //設定錯誤報告等級

  • ini_set('error_reporting',0); //設定錯誤報告等級

PHP錯誤配置

  • #除了在腳本裡設置,還可以在php.ini設定檔裡配置

  • error_reporting = E_ALL&~E_NOTICE; //設定錯誤報告等級

  • display_errors = 1; //開發環境開啟,生產環境關閉

#PHP異常

  • PHP的例外是後來新增特性,與JAVA/C#的例外不同,PHP例外需要手動拋出throw new Exception,而不是系統自動拋出

  • #PHP錯誤與異常的區別,他們是2個不同的概念,但有共同的地方:

    如果異常不捕獲處理,程式將會終止,並報出Fatal Error 錯誤,看到這裡大家就會覺得異常是不是錯誤的一種,這是一種錯覺,但這樣理解也可以。但異常捕捉後程式可以繼續執行,而真正的Fatal Error錯誤出現後程式就必須終止

  • 異常可以使用try{}catch( ){} 來捕獲捕獲,捕獲之後後續程式碼可以繼續執行;而錯誤是無法使用try{}catch(){} 捕獲的

  • 如果拋出了異常,就必須捕獲它,否則程式終止執行。

PHP異常與錯誤的拋出

  • 異常拋出: throw new Exception('Some Error Message');

  • #錯誤拋出:trigger_error()

  • #trigger_error() 觸發的錯誤不會被try-catch 異常捕獲語句捕獲

##PHP錯誤處理

  • set_error_handler()

只能處理

DeprecatedNoticeWaning這三種層級錯誤,而且處理後,腳本將會繼續執行發生錯誤的後一行

  • ## register_shutdown_function()

  • 這個方法是腳本結束前的最後一個回呼函數,所以無論是die()/錯誤(例外)/或腳本正常結束都會呼叫

PHP異常處理

  • #set_exception_handler()

設定預設的例外處理程序,有try/catch捕獲的話這個函數就不會執行,反之就會執行,而且執行的話,腳本將不會繼續執行發生異常的後一行程式碼,程式馬上中止
  • set_exception_handler()

    注意事項

set_exception_handler(“myException”) 不只可以接受函式名稱,也可以接受類別的方法公開的靜態方法公開的非靜態方法 都可以),但需要以陣列形式傳遞,數組的第一值為“類別名稱”,第二個參數為“方法名稱

”,如下程式碼所示:

<?php
class App{
    function myException($exception) {
        echo "<b>Exception:</b> " , $exception->getMessage();
    }
}
 
set_exception_handler(array(&#39;App&#39;,&#39;myException&#39;));
 
throw new Exception(&#39;Uncaught Exception occurred&#39;);
?>
PHP異常分類

  • 由於使用者行為導致出現異常

    1、沒有通過驗證器###

    2、没查询到结果

    3、需要向用户返回具体信息

    4、不需要记录日志

    5、可作为异常或者不作为异常,根据需求和个人情况而定

  • 由于服务器自身导致出现异常

    1、代码出错

    2、调用第三方接口错误

    3、不需要向用户返回具体信息

    4、需要记录日志

在程序中PHP异常的自动抛出

  • 由于PHP异常是后面版本新增的特性,设计上与JAVA/C#的异常不一样,JAVA的异常大部分是系统自动抛出,而PHP异常不是系统自动抛出,需要手动抛出导致PHP异常在程序中的作用减半(异常就是意料之外的事情,根本我们意料不到的,如果用手动抛出,证明已经预先预料到了,那异常的意义就变味了)

  • 在PHP中异常是手动抛出的,而错误是系统自动抛出的(也可手动抛)

  • 我们需要把异常做成系统自动抛出接(例如JAVA)就必须借助错误(这三种错误DeprecatedNoticeWaning,其他的错误不行,因为会终止程序运行)

<?php

    set_error_handler(&#39;error_handler&#39;);

    function error_handler($errno, $errstr, $errfile, $errline) {
        throw new Exception($errstr);
    }

    try {
        $num = 100 / 0;
    } catch(Exception $e) {
        echo $e -> getMessage() . &#39;<br/>&#39;;
    }

    echo "end";
?>

执行结果:

Division by zero
end

PHP7 异常处理的大变化

  • 一段TP5源代码引出PHP7异常的变化

    詳解PHP中錯誤與異常及其相關知識

    明明set_exception_handler()函数只可以捕获Exception类或派生类的对象,为何还需要捕获的对象做判断呢?结果引出了PHP7的变化,请看下面分析

  • 前面已经讲过异常是需要手动抛出,及时上面所说的方法最多也是把DeprecatedNoticeWaning这3类错误封装成系统自动抛出的异常,但致命错误仍然还是无法封装成系统自动抛出的异常,因为致命错误(Fatel Error)仍然无法捕获

  • 在PHP7之前,DeprecatedNoticeWaning这类错误是可以捕获的(使用set_error_handler()函数),而Fatel Error无法捕获的

  • 在PHP7之后,出现了一个异常与错误通用的接口Throwable,Exception类与Error类都实现了该接口,导致Error类或Error类的派生类的错误对象(大部分Fatel Error,而之前三类错误不变)也可以像Exception一样被捕获(2种捕获方法:1、try/catch  2、set_exception_handler())

  • 示例代码

try{
    go();//该函数未定义
}catch(Exception $e){
    //捕获异常
}catch(Error $er){
    //捕获错误
}

相关教程推荐:《PHP教程

以上是詳解PHP中錯誤與異常及其相關知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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