PHP 錯誤與異常

PHP錯誤級別

Parse error > Fatal Error > Waning > Notice > Deprecatedphp

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

  • Notice 通知級別的錯誤
    使用一些未定義變量、常量或者數組key沒有加引號的時候會出現,程序繼續執行服務器

  • Waning 警告級別的錯誤
    程序出問題了,須要修改代碼!!!程序繼續執行函數

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

  • Parse error 語法解析錯誤
    語法檢查階段報錯,須要修改代碼!!!中斷程序執行,除了修改ini文件,將錯誤信息寫到日誌中,什麼也作不了設計

  • E_USER_相關的錯誤
    用戶定義的錯誤,用戶手動拋出錯誤,進行自定義錯誤處理日誌

PHP錯誤相關函數

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

  • error_reporting(E_ALL&~E_NOTICE); //設置錯誤報告級別對象

  • ini_set('error_reporting',0); //設置錯誤報告級別blog

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異常與錯誤的拋出

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

  2. 錯誤拋出:trigger_error()

  3. 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('App','myException'));
 
throw new Exception('Uncaught Exception occurred');
?>

PHP異常分類

  • 因爲用戶行爲致使出現異常

    一、沒有經過驗證器
    二、沒查詢到結果
    三、須要向用戶返回具體信息
    四、不須要記錄日誌
    五、可做爲異常或者不做爲異常,根據需求和我的狀況而定
  • 因爲服務器自身致使出現異常

    一、代碼出錯
    二、調用第三方接口錯誤
    三、不須要向用戶返回具體信息
    四、須要記錄日誌

在程序中PHP異常的自動拋出

  • 因爲PHP異常是後面版本新增的特性,設計上與JAVA/C#的異常不同,JAVA的異常大部分是系統自動拋出,而PHP異常不是系統自動拋出,須要手動拋出致使PHP異常在程序中的做用減半(異常就是意料以外的事情,根本咱們意料不到的,若是用手動拋出,證實已經預先預料到了,那異常的意義就變味了)

  • 在PHP中異常是手動拋出的,而錯誤是系統自動拋出的(也可手動拋)

  • 咱們須要把異常作成系統自動拋出接(例如JAVA)就必須藉助錯誤(這三種錯誤DeprecatedNoticeWaning,其餘的錯誤不行,由於會終止程序運行)

<?php

    set_error_handler('error_handler');

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

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

    echo "end";
?>

執行結果:
Division by zero
end

PHP7 異常處理的大變化

  • 一段TP5源代碼引出PHP7異常的變化圖片描述明明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種捕獲方法:一、try/catch 二、set_exception_handler())

  • 示例代碼

try{
    go();//該函數未定義
}catch(Exception $e){
    //捕獲異常
}catch(Error $er){
    //捕獲錯誤
}
相關文章
相關標籤/搜索