二、error_reporting() 及 try-catch、thrown
error_reporting() 函數(shù)可以獲取(不傳參時)、設(shè)定腳本處理哪些異常(并非所有異常都需要處理,例如 E_CORE_WARNING、E_NOTICE、E_DEPRECATED 是可以忽略的),該設(shè)定將覆蓋 php.ini 中 error_reporting選項定義的異常處理設(shè)定。
例如:
error_reporting(E_ALL&~E_NOTICE) ; // 除了E_NOTICE其他異常都會被觸發(fā)(E_ALL&~E_NOTICE的二進(jìn)制運算結(jié)果是:E_NOTICE對應(yīng)位的值被設(shè)置為0)
try-catch 無法在類的自動加載函數(shù) __autoload() 內(nèi)生效。
try-catch 無法用于捕獲異常,無法捕獲錯誤,例如 trigger_error() 觸發(fā)的錯誤,異常和錯誤是不一樣的。
try{
// you codes that maybe cause an error
}catch(Exception $err){ // 這個錯誤對象需要聲明類型, Exception 是系統(tǒng)默認(rèn)異常處理類
echo $err->getMessage();
}
//thrown 可以拋出一個異常,如:
thrown new Exception('an error');
一個例子:
try {
if ( empty( $var1 ) ) throw new NotEmptyException();
if ( empty( $var2 ) ) throw new NotEmptyException();
if ( ! preg_match() ) throw new InvalidInputException();
$model->write();
$template->render( 'success' );
} catch ( NotEmptyException $e ) {
$template->render( 'error_empty' );
} catch ( InvalidInputException $e ) {
$template->render( 'error_preg' );
}
Exception 類的結(jié)構(gòu):其中大部分方法都是 禁止改寫的(final )
Exception {
/* 屬性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = null]]] )
final public string getMessage ( void ) //異常拋出的信息
final public Exception getPrevious ( void ) //前一異常
final public int getCode ( void ) //異常代碼,這是用戶自定義的
final public string getFile ( void ) //發(fā)生異常的文件路勁
final public int getLine ( void ) //發(fā)生異常的行
final public array getTrace ( void ) //異常追蹤信息(array)
final public string getTraceAsString ( void ) //異常追蹤信息(string)
public string __toString ( void ) //試圖直接 將異常對象當(dāng)作字符串使用時調(diào)用子函數(shù)的返回值
final private void __clone ( void ) //克隆異常對象時調(diào)用
}
擴(kuò)展異常類
try-catch 可以有多個 catch 子句,從第一個 catch 子句開始,如果子句內(nèi)的 異常變量 類型匹配 thrown 語句拋出的異常類型,則該子句會被執(zhí)行而不再執(zhí)行其他catch子句,否則繼續(xù)嘗試下一個 catch 子句,由于Exception 是所有 異常類的基類,因此拋出的異常都會與他匹配 ,如果你像個根據(jù)不同異常類型使用不同的處理方法,應(yīng)該將 Exception 類型的 catch 子句放到最后。
Exception 是所有異常的基類,可以根據(jù)實際需要擴(kuò)展異常類,
calss MyException extends Exception{
public errType = 'default';
public function __construct($errType=''){
$this->errType = $errType;
}
}
thrown new MyException (); //拋出一個異常
try{
// you codes that maybe cause an error
}catch(MyException $err){ // 這個錯誤對象需要聲明類型
echo $err->errType();
}catch(ErrorException $err){ //ErrorException 是 PHP 5 增加的異常類,繼承于 Exception
echo 'error !';
}catch(Exception $err){
redirect('/error.php');
}
你可能會在 catch 子句中判斷異常的類型,或者根據(jù) code 等信息來決定是否處理異常,如果你卸載 catch 子句的代碼無法適當(dāng)?shù)奶幚聿东@的異常,你可以在 catch 子句內(nèi)繼續(xù) 拋出異常。
本文導(dǎo)航
- 第1頁: 首頁
- 第2頁: try-catch
- 第3頁: Exception 異常的回調(diào)函數(shù)