版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第再談PHP錯(cuò)誤與異常處理if($error=error_get_last()){
var_dump('bregister_shutdown_function:Type:'.$error['type'].'Msg:'.$error['message'].'in'.$error['file'].'online'.$error['line'].'/b
require'a.php';
3:set_exception_handler()
設(shè)置默認(rèn)的異常處理程序,用在沒有用try/catch塊來捕獲的異常,也就是說不管你拋出的異常有沒有人捕獲,如果沒有人捕獲就會進(jìn)入到該方法中,并且在回調(diào)函數(shù)調(diào)用后異常會中止。看一下用法:
set_exception_handler('zyfexception');
functionzyfexception($exception)
var_dump("bset_exception_handler:Exception:".$exception-getMessage().'/b
thrownewException("zyfexception");
四、巧妙的捕獲錯(cuò)誤和異常
1:把錯(cuò)誤以異常的形式拋出(不能完全拋出)
由上面的講解我們知道,php中的錯(cuò)誤是不能以異常的像是捕獲的,但是我們需要讓他們拋出,已達(dá)到擴(kuò)展try-catch的影響范圍,我們前面講到過set_error_handler()方法,他是干嘛用的,他是捕獲錯(cuò)誤的,所以我們就可以借助他來吧錯(cuò)誤捕獲,然后再以異常的形式拋出,ok,試試下面的寫法:
set_error_handler('zyferror');
functionzyferror($type,$message,$file,$line)
thrownew\Exception($message.'zyf錯(cuò)誤當(dāng)做異常');
$num=0;
try{
echo1/$num;
}catch(Exception$e){
echo$e-getMessage();
好了,試一下,會打印出:
Divisionbyzerozyf123
流程:本來是除0錯(cuò)誤,然后觸發(fā)set_error_handler(),在set_error_handler()中相當(dāng)與殺了個(gè)回馬槍,再把錯(cuò)誤信息以異常的形式拋出來,這樣就可以實(shí)現(xiàn)錯(cuò)誤以異常的形式拋出。大家要注意:這樣做是有缺點(diǎn)的,會受到set_error_handler()函數(shù)捕獲級別的限制。
2:捕獲所有的錯(cuò)誤
由set_error_handler()可知,他能夠捕獲一部分錯(cuò)誤,不能捕獲系統(tǒng)級E_ERROR、E_PARSE等錯(cuò)誤,但是這部分可以由register_shutdown_function()捕獲。所以兩者結(jié)合能出現(xiàn)很好的功能。
看下面的程序:
a.php內(nèi)容:
//模擬Fatalerror錯(cuò)誤
//test();
//模擬用戶產(chǎn)生ERROR錯(cuò)誤
//trigger_error('zyf-error',E_USER_ERROR);
//模擬語法錯(cuò)誤
var_dump(23+-+);
//模擬Notice錯(cuò)誤
//echo$f;
//模擬Warning錯(cuò)誤
//echo'123';
//ob_flush();
//flush();
//header("Content-type:text/html;charset=gb2312");
b.php內(nèi)容:
error_reporting(0);
register_shutdown_function('zyfshutdownfunc');
functionzyfshutdownfunc()
if($error=error_get_last()){
var_dump('bregister_shutdown_function:Type:'.$error['type'].'Msg:'.$error['message'].'in'.$error['file'].'online'.$error['line'].'/b
set_error_handler('zyferror');
functionzyferror($type,$message,$file,$line)
var_dump('bset_error_handler:'.$type.':'.$message.'in'.$file.'on'.$line.'line./bbr/
require'a.php';
到此就可以解釋開頭的那個(gè)程序了吧,test.php如果是單文件執(zhí)行是不能捕獲到錯(cuò)誤的,如果你在框架中執(zhí)行就是可以的,當(dāng)然你按照我上面介紹的來擴(kuò)展也是可以的。
五、自定義異常處理和異常嵌套
1:自定義異常處理
在復(fù)雜的系統(tǒng)中,我們往往需要自己捕獲我們需要特殊處理的異常,這些異??赡苁翘厥馇闆r下拋出的。所以我們就自己定義一個(gè)異常捕獲類,該類必須是exception類的一個(gè)擴(kuò)展,該類繼承了PHP的exception類的所有屬性,并且我們可以添加自定義的函數(shù),使用的時(shí)候其實(shí)和之前的一樣,大致寫法如下:
classzyfExceptionextendsException
publicfunctionerrorzyfMessage()
return'Errorline'.$this-getLine().'in'.$this-getFile()
.':b'.$this-getMessage().'/bMustin(0-60)';
$age=10;
try{
$age=intval($age);
if($age60){
thrownewzyfException($age);
}catch(zyfException$e){
echo$e-errorzyfMessage();
2:異常嵌套
異常嵌套是比較常見的寫法,在自定義的異常處理中,try塊中可以定義多個(gè)異常捕獲,然后分層傳遞異常,理解和冒泡差不多,看下面的實(shí)現(xiàn):
$age=10;
try{
$age=intval($age);
if($age60){
thrownewzyfException($age);
if($age=0){
thrownewException($age.'must0');
}catch(zyfException$e){
echo$e-errorzyfMessage();
}catch(Exception$e){
echo$e-getMessage();
當(dāng)然也可以在catch中再拋出異常給上層:
$age=100;
try{
try{
$age=intval($age);
if($age60){
thrownewException($age);
}catch(Exception$e){
thrownewzyfException($age);
}catch(zyfException$e){
echo$e-errorzyfMessage();
六、PHP7中的異常處理
現(xiàn)在寫PHP必須考慮版本情況,上面的寫法在PHP7中大部分都能實(shí)現(xiàn),但是也會有不同點(diǎn),在PHP7更新中有一條:更多的Error變?yōu)榭刹东@的Exception,現(xiàn)在的PHP7實(shí)現(xiàn)了一個(gè)全局的throwable接口,原來老的Exception和其中一部分Error實(shí)現(xiàn)了這個(gè)接口(interface),PHP7中更多的Error變?yōu)榭刹东@的Exception返回給捕捉器,這樣其實(shí)和前面提到的擴(kuò)展try-catch影響范圍一樣,但是如果不捕獲則還是按照Error對待,看下面兩個(gè):
try{
test();
}catch(Throwable$e){
echo$e-getMessage().'zyf';
try{
test();
}catch(Error$e){
echo$e-getMessage().'zyf';
因?yàn)镻HP7實(shí)現(xiàn)了throwable接口,那么就可以使用第一個(gè)這種方式來捕獲異常。又因?yàn)椴糠諩rror實(shí)現(xiàn)了接口,并且更多的Error變?yōu)榭刹东@的Exception,那么就可以使用第二種方式來捕獲異常。下面是在網(wǎng)上找的PHP7的異常層次樹:
Throwable
Exception異常
...
Er
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職第二學(xué)年(護(hù)理)老年照護(hù)專項(xiàng)試題及答案
- 2025年大學(xué)本科(食品質(zhì)量與安全)食品分析試題及答案
- 2025年大學(xué)食品科學(xué)與工程(食品工程)試題及答案
- 2025年中職焊接技術(shù)與自動(dòng)化(手工焊接)試題及答案
- 養(yǎng)老院老人心理咨詢師培訓(xùn)制度
- 養(yǎng)老院心理慰藉制度
- 公共交通從業(yè)人員培訓(xùn)考核制度
- 2026年人工智能計(jì)算機(jī)視覺基礎(chǔ)知識題庫含答案
- 2026年刮痧師中醫(yī)理論考核試題含答案
- 2026年中級公共文化服務(wù)面試題及答案
- 土壤微生物群落結(jié)構(gòu)優(yōu)化研究
- 2024外研版四年級英語上冊Unit 4知識清單
- 四川省南充市2024-2025學(xué)年部編版七年級上學(xué)期期末歷史試題
- 國有企業(yè)三位一體推進(jìn)內(nèi)控風(fēng)控合規(guī)建設(shè)的問題和分析
- 急診預(yù)檢分診課件教學(xué)
- 2025年高二數(shù)學(xué)建模試題及答案
- 儲能集裝箱知識培訓(xùn)總結(jié)課件
- 幼兒園中班語言《雪房子》課件
- 房地產(chǎn)項(xiàng)目開發(fā)管理方案
- 堆垛車安全培訓(xùn)課件
- 貝林妥單抗護(hù)理要點(diǎn)
評論
0/150
提交評論