與異常相關的配置項:
①:錯誤有兩種呈現方式,一種是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