再談PHP錯(cuò)誤與異常處理_第1頁
再談PHP錯(cuò)誤與異常處理_第2頁
再談PHP錯(cuò)誤與異常處理_第3頁
再談PHP錯(cuò)誤與異常處理_第4頁
再談PHP錯(cuò)誤與異常處理_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論