1.拋出一個(gè)異常
從PHP5開始受裹,PHP支持 異常處理 宿百,異常處理是面向?qū)ο蟮囊粋€(gè)重要特性壁公,PHP代碼中的異常通過throw拋出,異常拋出之后,后面的代碼將不會(huì)再被執(zhí)行.
既然拋出異常會(huì)中斷程序執(zhí)行曲尸,那么為什么還需要使用異常處理赋续?
異常拋出被用于在遇到未知錯(cuò)誤,或者不符合預(yù)先設(shè)定的條件時(shí)另患,通知客戶程序纽乱,以便進(jìn)行其他相關(guān)處理,不至于使程序直接報(bào)錯(cuò)中斷.
當(dāng)代碼中使用了try catch的時(shí)候昆箕,拋出的異常會(huì)在catch中捕獲鸦列,否則會(huì)直接中斷。
1鹏倘、基本語法
try{
//可能出現(xiàn)錯(cuò)誤或異常的代碼
//catch表示捕獲薯嗤,Exception是php已定義好的異常類
} catch(Exception $e){
//對(duì)異常處理,方法:
//1纤泵、自己處理
//2骆姐、不處理,將其再次拋出
}
2捏题、異常處理程序應(yīng)當(dāng)包括:
- Try - 使用異常的函數(shù)應(yīng)該位于 "try" 代碼塊內(nèi)玻褪。如果沒有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行公荧。但是如果異常被觸發(fā)带射,會(huì)拋出一個(gè)異常。
- Throw - 這里規(guī)定如何觸發(fā)異常稚矿。注意:每一個(gè) "throw" 必須對(duì)應(yīng)至少一個(gè) "catch"庸诱,當(dāng)然可以對(duì)應(yīng)多個(gè)"catch".
- Catch - "catch" 代碼塊會(huì)捕獲異常捻浦,并創(chuàng)建一個(gè)包含異常信息的對(duì)象晤揣。
//創(chuàng)建可拋出一個(gè)異常的函數(shù)
function checkNum($number){
if($number>1){
throw new Exception("異常提示-數(shù)字必須小于等于1");
}
return true;
}
//在 "try" 代碼塊中觸發(fā)異常
try{
checkNum(2);
//如果異常被拋出,那么下面一行代碼將不會(huì)被輸出
echo '如果能看到這個(gè)提示朱灿,說明你的數(shù)字小于等于1';
}catch(Exception $e){
//捕獲異常
echo '捕獲異常: ' .$e->getMessage();
}
上面代碼將獲得類似這樣一個(gè)錯(cuò)誤:
捕獲異常:: 異常提示-數(shù)字必須小于等于1
例子解釋:
上面的代碼拋出了一個(gè)異常昧识,并捕獲了它:
創(chuàng)建 checkNum() 函數(shù)。它檢測(cè)數(shù)字是否大于 1盗扒。如果是跪楞,則拋出一個(gè)異常。在 "try" 代碼塊中調(diào)用 checkNum() 函數(shù)侣灶。
checkNum() 函數(shù)中的異常被拋出 "catch" 代碼塊接收到該異常甸祭,并創(chuàng)建一個(gè)包含異常信息的對(duì)象 ($e)。通過從這個(gè) exception 對(duì)象調(diào)用 $e->getMessage()褥影,輸出來自該異常的錯(cuò)誤消息
2.異常處理類
PHP具有很多異常處理類池户,其中Exception是所有異常處理的基類。Exception具有幾個(gè)基本屬性與方法,其中包括了:
- message 異常消息內(nèi)容
- code 異常代碼
- file 拋出異常的文件名
- line 拋出異常在該文件的行數(shù)其中常用的方法有:
- getTrace 獲取異常追蹤信息
- getTraceAsString 獲取異常追蹤信息的字符串
- getMessage 獲取出錯(cuò)信息如果必要的話校焦,可以通過繼承Exception類來建立自定義的異常處理類赊抖。
//自定義的異常類,繼承了PHP的異痴洌基類Exception
class MyException extends Exception {
function getInfo() {
return '自定義錯(cuò)誤信息';
}
}
try {
//使用異常的函數(shù)應(yīng)該位于 "try" 代碼塊內(nèi)氛雪。如果沒有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行耸成。但是如果異常被觸發(fā)报亩,會(huì)拋出一個(gè)異常。
throw new MyException('error');//這里規(guī)定如何觸發(fā)異常井氢。注意:每一個(gè) "throw" 必須對(duì)應(yīng)至少一個(gè) "catch"捆昏,當(dāng)然可以對(duì)應(yīng)多個(gè)"catch"
} catch(Exception $e) {
//"catch" 代碼塊會(huì)捕獲異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象
echo $e->getInfo();//獲取自定義的異常信息
echo $e->getMessage();//獲取繼承自基類的getMessage信息
}
3.捕獲異常信息
在了解了異常處理的基本原理之后毙沾,我們可以通過try catch來捕獲異常骗卜,我們將執(zhí)行的代碼放在try代碼塊中,一旦其中的代碼拋出異常左胞,就能在catch中捕獲寇仓。這里我們只是通過案例來了解try catch的機(jī)制以及異常捕獲的方法,在實(shí)際應(yīng)用中烤宙,不會(huì)輕易的拋出異常遍烦,只有在極端情況或者非常重要的情況下,才會(huì)拋出異常躺枕,拋出異常服猪,可以保障程序的正確性與安全,避免導(dǎo)致不可預(yù)知的bug拐云。一般的異常處理流程代碼為:
try {
throw new Exception('wrong');
} catch(Exception $ex) {
echo 'Error:'.$ex->getMessage().'<br>';
echo $ex->getTraceAsString().'<br>';
}
echo '異常處理后罢猪,繼續(xù)執(zhí)行其他代碼';
4.獲取錯(cuò)誤發(fā)生的所在行
在異常被捕獲之后,我們可以通過異常處理對(duì)象獲取其中的異常信息叉瘩,前面我們已經(jīng)了解捕獲方式膳帕,以及獲取基本的錯(cuò)誤信息。在實(shí)際應(yīng)用中薇缅,我們通常會(huì)獲取足夠多的異常信息危彩,然后寫入到 錯(cuò)誤日志 中。通過我們需要將報(bào)錯(cuò)的文件名泳桦、行號(hào)汤徽、錯(cuò)誤信息、異常追蹤信息等記錄到日志中灸撰,以便調(diào)試與修復(fù)問題谒府。
<?php
try {
throw new Exception('wrong');
} catch(Exception $ex) {
$msg = 'Error:'.$ex->getMessage()."\n";
$msg.= $ex->getTraceAsString()."\n";
$msg.= '異常行號(hào):'.$ex->getLine()."\n";
$msg.= '所在文件:'.$ex->getFile()."\n";
//將異常信息記錄到日志中
file_put_contents('error.log', $msg);
}