php處理異常機制

與異常相關的配置項:

①:錯誤有兩種呈現方式,一種是display_errors=on /off 配置項控制錯誤是否顯示到瀏覽器中,另一種是log_errors和error_log配置的錯誤日誌裏面

②:配置error_reporting設置錯誤報告級別,這個與display_errors和error_log有關,只會把對應的錯誤級別記錄到錯誤日誌中或者打印到瀏覽器上

異常處理:

①:try...catch的方式進行異常的捕獲,這其中是phper要主動拋出一個異常出來throw new exception();它會被第一個catch給捕獲,這裏有兩點注意,display_errors要開啓和錯誤是主動拋出的(throw);有個駁論就是既然要主動throw出來錯誤,那麼就是能夠判斷處那邊出問題,那麼都知道會出錯誤爲什麼還要捕獲呢?之間寫出正確的邏輯不就好了

②:框架中是可以捕獲所有的錯誤和異常的,主要用到register_shutdown_function,set_error_handler,set_exception_handler三個函數

        A: set_error_handler() 

這個函數用於捕獲錯誤,設置一個用戶自定義的錯誤處理函數,當程序出現錯誤的時候會自動調用此方法,不過需要注意一下兩點,第一:如果存在此方法,相應的error_reporting()就不能在使用了。所有的錯誤都會交給自定義的函數處理。第二:此方法不能處理一下錯誤級別(對應php的錯誤級別,文章下面會給出介紹)E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING;set_error_handler()函數所在的文件中產生的E_STRICT,該函數只能捕獲系統產生的一些warning、notice級別的錯誤。

例子:

 <?php
     set_error_handler('zyferror');
     function zyferror($type, $message, $file, $line)
     {
       var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />');
     }
 ?>

調用方法多樣:

 <?php
     // 直接傳函數名 NonClassFunction
      set_error_handler('function_name'); 
 
      // 傳 class_name && function_name
      set_error_handler(array('class_name', 'function_name')); 
 ?>

            B:register_shutdown_function()

捕獲PHP的錯誤:Fatal Error、Parse Error等,這個方法是PHP腳本執行結束前最後一個調用的函數,比如腳本錯誤,die(),exit,異常,正常結束都會調用;這個函數很吊,但它只提供了執行的時間,對於是否包含錯誤需要藉助於另一個函數:error_get_last();這個函數可以拿到本次執行中產生的錯誤。

error_get_last();返回的信息:【type】錯誤類型   , 【message】錯誤信息 , 【file】錯誤發生的文件,【line】錯誤所在行

例如:

 <?php
     register_shutdown_function('zyfshutdownfunc');
     function zyfshutdownfunc()
     {
         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:set_exception_handler()

設置默認的異常處理程序,用在沒有用try/catch塊來捕獲的異常,也就是說不管你拋出的異常有沒有人捕獲,如果沒有 人捕獲就會進入到該方法中,並且在回調函數調用後異常會中止。

例如:

 <?php
     set_exception_handler('zyfexception');
     function zyfexception($exception)
     {
         var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage()  . '</b>');
     }
     throw new Exception("zyfexception");
 ?>


擴展:錯誤類型和屏蔽方案

三種錯誤分類:1、注意(notice) 2、警告(warnings)3、致命錯誤(fatal  errors)

錯誤種類:

E_ERROR:通常會顯示出來,也會中斷程序執行。

E_WARNING:通常都會顯示出來,但不會中斷程序的執行。

E_NOTICE:在腳本正常運行下發生的代碼錯誤。

E_PARSE:語法解析錯誤。

E_CORE_ERROR:在PHP啓動時發生的致命錯誤。

E_CORE_WARNING:報告在PHP啓動時發生的非致命性錯誤。

E_COMPILE_ERROR:編譯時發生的致命錯誤,指出腳本的錯誤。

E_USER_ERROR:用戶產生的錯誤信息。

E_USER_WARNING:用戶產生的警告信息。

E_USER_NOTICE:用戶引發的注意消息。

E_STRICT:編碼標準化警告,運行時發生的錯誤。

E_RECOVERABLE_ERROR:接近致命的運行時錯誤,若未被捕獲則視同E_ERROR。

E_ALL:捕獲所有的錯誤和警告。

 

屏蔽PHP錯誤提示

方法一:在有可能出錯的函數前加@,然後or die("") 如:

@mysql_connect(...) or die("Database Connect Error")

方法二:編輯php.ini ,查找"display_errors =" ,將“=”後面的值改爲"off。

方法三:在php腳本前加error_reporting(0),屏蔽所有錯誤提示。

其中,error_reporting 配置錯誤信息回報的等級。

語法:int error_reporting(int [level]);


文章借鑑地址:https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章