在try代碼塊中,需要使用throw語句拋出一個異常對象,才能跳到轉到catch代碼塊中執行,並在catch代碼塊中捕獲並使用這個異常類的對象。雖然在PHP中提供的內置異常處理類Exception,已經具有非常不錯的特性,但在某些情況下,可能還要擴展這個類來得到更多的功能。所以用戶可以用自定義的異常處理類來擴展PHP內置的異常處理類。以下代碼說明了在內置的異常處理類中,哪些屬性和方法在子類中是可訪問和可繼承的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19<?php
class
Exception{
protected
$message
=
'Unknown exception'
;
//異常信息
protected
$code
= 0;
//用戶自定義異常代碼
protected
$file
;
//發生異常的文件名
protected
$line
;
//發生異常的代碼行號
function
__construct(
$message
=null,
$code
=0){}
final
function
getMessage(){}
//返回異常信息
final
function
getCode(){}
//返回異常代碼
final
function
getFile(){}
//返回發生異常的文件名
final
function
getLine(){}
//返回發生異常的代碼行號
final
function
getTrace(){}
//backtrace()數組
final
function
getTraceAsString(){}
//已格式化成字符串的getTrace()信息
//可重載的方法,可輸出字符串
function
__toString(){}
}
?>
上面這段代碼只為說明內置異常處理函數類Exception的結構,它並不是一段有實際意義的可用代碼。如果使用自定義的類作為異常處理類,則必須是擴展內置異常處理類Exception的子類,非Exception類的子類是不能作為異常處理類使用的。如果在擴展內置異常處理類Excepiton時重新定義構造函數,建議同時調用parent::construct()來檢查所有的變量是否已被賦值。當對象要輸出字符串的時候,可以重載__toString()並自定義輸出的樣式。可以在自定義的子類中,直接使用內置異常處理Exception類中的所有成員屬性,但不能重新改寫從該父類中繼承過來的成員方法,因為該類的大多數公有方法都是final的。
創建自定義的異常處理程序非常簡單,和傳統類的聲明方式相同,但該類必須是內置異常處理類Exception的一個擴展。當PHP中發生異常時,可調用自定義異常類中的方法進行處理。創建一個自定義的MyException類,繼承了內置異常處理類Exception中的所有屬性,並向其添加了自定義的方法。代碼及應用如下所示:
<?php
//滴定儀一個異常處理類,但必須是擴展內異常處理類的子類
class
MyException
extends
Exception{
//重定義構造器使第一個參數message變為必須被指定屬性
public
function
__construct(
$message
,
$code
=0){
//在這裡定義一些自己的代碼
//建議同時調用parent::construct()來檢查所有的變量是否已被賦值
parent::__construct(
$message
,
$code
);
}
//重寫父類方法,自定義字符串輸出的樣式
public
function
__toString(){
return
__CLASS__
.
":["
.
$this
->code.
"]:"
.
$this
->message.
"<br>"
;
}
//為這個異常自定義一個處理方法
public
function
customFunction(){
echo
"按自定義的方法處理出現的這個類型的異常<br>"
;
}
}
try
{
$error
=
'允許拋出這個錯誤'
;
throw
new
MyException(
$error
);
//創建一個自定義異常的處理對象,通過throw語句拋出
echo
'Never executed'
;
//從這裡開始,try代碼塊內的代碼將不會再被執行
}
catch
(MyException
$e
){
//捕獲自定義的異常對象
echo
'捕獲異常:'
.
$e
;
//輸出捕獲的異常消息
$e
->customFunction();
//通過自定義的異常對象中的方法處理異常
}
echo
'你好呀'
;
//程序沒有崩潰繼續向下執行
?>
在自定義的MyExcepition類中,使用父類中的構造方法檢查所有的變量是否已被賦值。而且重載了父類中的__toString()方法,輸出自己定制捕獲的異常處理類,在使用上沒有多大區別,只不過在自定義的異常處理類中,可以調用為具體的異常專門編寫的處理方法。
>> 本文固定鏈接: http://php.ncong.com/php_course/wrong/yichangchulilei.html
>> 轉載請注明: 恩聰php 2014年08月06日 於 恩聰PHP學習教程 發表
這個問題我前幾天也跟同事討論過。我這麼來解釋把
比如你調用了try catch ,數組超標,那程序怎麼知道是數組超標呢,那肯定是數組類報出來的。
而數組類裡面,肯定是throw出來,你才能catch到,得到message,數組超標,但是如果數組類裡面,直接catch了,就沒有異常了!這樣你調用數組即使超標了,你自己的catch是catch不到,因為沒人拋出異常
別人的回答太官話了,求采納我的
我們介紹的這個PHP自定義異常處理器為PHP內置的exception_uncaught_handler()函數。該函數可用於設置用戶自定義的異常處理函數,處理trycatch塊未捕獲的異常。
以下4段代碼為我在waylife項目中的簡單應用(非生產環境),不健壯也不美化,但該SNS項目早已經夭折。
1、異常類的層級關系:
classNotFoundExceptionextendsException{}
classInputExceptionextendsException{}
classDBExceptionextendsException{}
2、配置未捕捉異常的處理器:
functionexception_uncaught_handler(Exception$e){
header('Content-type:text/html;charset=utf-8');if($einstanceofNotFoundException)exit($e-
getMessage());
elseif($einstanceofDBException)exit($e-
getMessage());elseexit($e-
getMessage());}set_exception_handler('exception_uncaught_handler');
3、在數據庫連接代碼源碼天空
,手動拋出DBException異常但未使用trycatch進行捕獲處理,該異常將被PHP自定義異常處理器exception_uncaught_handler()函數處理:$this-resConn=mysql_connect
($CONFIGS['db_host'],$CONFIGS['db_user'],$CONFIGS['db_pwd']);if(false==is_resource($this-resConn))thrownewDBException('數據庫連接失敗。'.mysql_error($this-resConn));4、業務邏輯一瞥:
if(0!=strcmp($curAlbum-
interest_id,$it))
thrownewNotFoundException('很抱歉,你所訪問的相冊不存在');