在實際開發中,錯誤及異常捕捉僅僅靠try{}catch()是遠遠不夠的。 所以引用以下幾中函數。
我們先來說異常:
首先要明白異常跟錯誤是不一樣的,異常是出現正常邏輯之外的情況,而錯誤是指運行時出錯了,比如,使用了一個未定義的變量等,異常需要拋出(throw)才能被捕捉到,而錯誤會導致程序執行終止
1、通常處理異常的方式是使用try{}catch{}去捕捉有throw拋出的異常
- try{
- throw new Exception("kkkkkkkkkkkkkkkk");
- }
- catch(Exception $e){
- echo $e->getMessage(),"</br>",$e->getTraceAsString();
- }
2、通過set_exception_handler函數設置異常處理函數,在這種情況下,即使沒有try{}catch{},throw拋出的異常也能由set_exception_handler設置的函數自動捕捉
- set_exception_handler('exceptionHandler');
- throw new Exception("kkkkkkkkkkkkkkkk");
- function exceptionHandler(Exception $exception){
- echo $exception->getMessage();
- }
接下來討論錯誤:
通常程序出錯了,PHP會輸出出錯的信息來幫助調試,但是這個信息的輸出是可以通過函數error_reporting()來控制的。在php中錯誤是分等級和種類的,下面是所有錯誤種類的說明:
E_ALL - 所有的錯誤和警告(不包括 E_STRICT)
E_ERROR - 致命性的運行時錯誤
E_WARNING - 運行時警告(非致命性錯誤)
E_PARSE - 編譯時解析錯誤
E_NOTICE - 運行時提醒(這些經常是你代碼中的bug引起的,也可能是有意的行爲造成的。)
E_STRICT - 編碼標準化警告,允許PHP建議如何修改代碼以確保最佳的互操作性向前兼容性。
E_CORE_ERROR - PHP啓動時初始化過程中的致命錯誤
E_CORE_WARNING - PHP啓動時初始化過程中的警告(非致命性錯)
E_COMPILE_ERROR - 編譯時致命性錯
E_COMPILE_WARNING - 編譯時警告(非致命性錯)
E_USER_ERROR - 用戶自定義的錯誤消息
E_USER_WARNING - 用戶自定義的警告消息
E_USER_NOTICE - 用戶自定義的提醒消息
如果設置了error_reporting(E_NOTICE),那麼程序只會輸出E_NOTICE等級的信息,一般我們使用的時候只需要設置error_reporting(E_ALL&!E_WARNING)就行了
上面我們看到有一種錯誤叫用戶自定義的錯誤消息,這是什麼呢?我們先看一個例子
- set_error_handler('errorHandler');
- trigger_error("aaaaaaassssssssssss",E_USER_ERROR);
- function errorHandler($errno,$errstr){
- <span style="white-space:pre"> </span>if($errno==E_USER_ERROR){
- <span style="white-space:pre"> </span>echo "innnnnnnni:",$errstr;
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>
- }
- innnnnnnni:aaaaaaassssssssssss
trigger_error()就是用來拋出用戶自定義錯誤消息的函數,通過這個我們能拋出自定義的一些消息被當作錯誤來處理,比如嚴重的邏輯問題
上面的程序我們看到,當程序出錯時,除了讓Php默認輸出出錯信息外,我們還能設置自己的錯誤處理函數,設置的方法就是set_error_handler(),下面來看個例子
- set_error_handler('errorHandler');
- echo "dddddddddddd</br>";
- echo $cc;//$cc沒有定義,echo會出錯
- function errorHandler($errno,$errstr){
- if($errno==E_NOTICE){
- echo "innnnnnnni:",$errstr;
- }
- }
輸出結果:dddddddddddd
innnnnnnni:Undefined variable: cc