摘要:但異常捕獲后程序可以繼續執行,而真正的錯誤出現后程序就必須終止異常可以使用來捕獲捕獲,捕獲之后后續代碼可以繼續執行而錯誤是無法使用捕獲的如果拋出了異常,就必須捕獲它否則程序終止執行。
PHP錯誤級別
Parse error > Fatal Error > Waning > Notice > Deprecated
Deprecated 最低級別的錯誤(不推薦,不建議)
使用一些過期函數的時候會出現,程序繼續執行
Notice 通知級別的錯誤
使用一些未定義變量、常量或者數組key沒有加引號的時候會出現,程序繼續執行
Waning 警告級別的錯誤
程序出問題了,需要修改代碼!!!程序繼續執行
Fatal Error 錯誤級別的錯誤
程序直接報錯,需要修改代碼!!!中斷程序執行,可使用register_shutdown_function()函數在程序終止前觸發一個函數
Parse error 語法解析錯誤
語法檢查階段報錯,需要修改代碼!!!中斷程序執行,除了修改ini文件,將錯誤信息寫到日志中,什么也做不了
E_USER_相關的錯誤
用戶定義的錯誤,用戶手動拋出錯誤,進行自定義錯誤處理
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()
只能處理Deprecated、Notice、Waning這三種級別錯誤,而且處理后,腳本將會繼續執行發生錯誤的后一行
register_shutdown_function()
這個方法是腳本結束前的最后一個回調函數,所以無論是die()/錯誤(異常)/還是腳本正常結束都會調用
PHP異常處理set_exception_handler()
設置默認的異常處理程序,有try/catch捕獲的話這個函數就不會執行,反之就會執行,而且執行的話,腳本將不會繼續執行發生異常的后一行代碼,程序馬上中止
set_exception_handler()注意事項
set_exception_handler(“myException”) 不僅可以接受函數名,還可以接受 類的方法(公開的靜態方法 及 公開的非靜態方法 都可以),但需要以 數組形式 傳遞,數組的第一值為“類名”,第二個參數為“方法名”,如下代碼所示:
Exception: " , $exception->getMessage(); } } set_exception_handler(array("App","myException")); throw new Exception("Uncaught Exception occurred"); ?>PHP異常分類
由于用戶行為導致出現異常
1、沒有通過驗證器 2、沒查詢到結果 3、需要向用戶返回具體信息 4、不需要記錄日志 5、可作為異常或者不作為異常,根據需求和個人情況而定
由于服務器自身導致出現異常
1、代碼出錯 2、調用第三方接口錯誤 3、不需要向用戶返回具體信息 4、需要記錄日志在程序中PHP異常的自動拋出
由于PHP異常是后面版本新增的特性,設計上與JAVA/C#的異常不一樣,JAVA的異常大部分是系統自動拋出,而PHP異常不是系統自動拋出,需要手動拋出,導致PHP異常在程序中的作用減半(異常就是意料之外的事情,根本我們意料不到的,如果用手動拋出,證明已經預先預料到了,那異常的意義就變味了)
在PHP中異常是手動拋出的,而錯誤是系統自動拋出的(也可手動拋)
我們需要把異常做成系統自動拋出接(例如JAVA)就必須借助錯誤(這三種錯誤Deprecated、Notice、Waning,其他的錯誤不行,因為會終止程序運行)
getMessage() . "PHP7 異常處理的大變化
"; } echo "end"; ?> 執行結果: Division by zero end
一段TP5源代碼引出PHP7異常的變化明明set_exception_handler()函數只可以捕獲Exception類或派生類的對象,為何還需要捕獲的對象做判斷呢?結果引出了PHP7的變化,請看下面分析
前面已經講過異常是需要手動拋出,及時上面所說的方法最多也是把Deprecated、Notice、Waning這3類錯誤封裝成系統自動拋出的異常,但致命錯誤仍然還是無法封裝成系統自動拋出的異常,因為致命錯誤(Fatel Error)仍然無法捕獲
在PHP7之前,Deprecated、Notice、Waning這類錯誤是可以捕獲的(使用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){ //捕獲錯誤 }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22991.html
摘要:異常與錯誤異常是指程序運行中不符合預期情況以及與正常流程不同的狀況。在中主要的錯誤等級如下最低級別的錯誤,表示不推薦不建議。小結中錯誤和異常是兩個不同的概念,這種設計根本上導致了的異常和錯誤與其它語言相異。中,異常時錯誤唯一的報告方式。 異常與錯誤 異常是指程序運行中不符合預期情況以及與正常流程不同的狀況。錯誤則屬于自身問題,是一種非法語法或者環境問題導致的、讓編譯器無法通過檢查設置無...
一、PHP錯誤處理 1.語法錯誤2.運行時錯誤3.邏輯錯誤:不提示錯誤,但功能不對,最麻煩4.三種級別:notice/warning/fatal error(無法繼續執行)5.錯誤報告顯示: a.可以在php.ini中修改error_reporting項目,以限定錯誤報告類型,如:error_reporting=E_ALL & ~E_NOTICE b.只修改某個腳本內的錯誤顯示,可以使用error...
摘要:一的幾個函數異常捕獲自定義處理函數注冊錯誤捕獲自定義處理函數注冊程序執行時異常終止錯誤捕獲處理函數注冊這三個函數在錯誤處理控制中給開發者提供了很大的自主空間,在日志系統中記錄日志信息有他們的功勞。下面要說的類庫是借鑒了日志系統的設計。 引言 接觸過php框架的朋友們可能都知道,日志在項目中的重要作用了,他可以幫助我們定位錯誤的位置,讓程序更友好(處理得當的話不會直接拋出一大堆只有程...
閱讀 3608·2021-11-15 11:37
閱讀 2974·2021-11-12 10:36
閱讀 4403·2021-09-22 15:51
閱讀 2381·2021-08-27 16:18
閱讀 881·2019-08-30 15:44
閱讀 2163·2019-08-30 10:58
閱讀 1768·2019-08-29 17:18
閱讀 3268·2019-08-28 18:25