摘要:是所有異常的基類。它包含的異常的確是對(duì)象,唯一條件就是必須從類繼承。在語(yǔ)句中使用所謂的是一關(guān)系對(duì)類的名字和異常對(duì)象做檢查。如果異常在任何地方都沒(méi)能捕獲,那么會(huì)提供最后的機(jī)會(huì)異常處理函數(shù)。
Exception是所有異常的基類。
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 ) final public int getLine ( void ) final public array getTrace ( void ) final public string getTraceAsString ( void ) public string __toString ( void ) final private void __clone ( void ) }
Exception::__construct — 異常構(gòu)造函數(shù) Exception::getMessage — 獲取異常消息內(nèi)容 Exception::getPrevious — 返回異常鏈中的前一個(gè)異常 Exception::getCode — 獲取異常代碼 Exception::getFile — 獲取發(fā)生異常的程序文件名稱 Exception::getLine — 獲取發(fā)生異常的代碼在文件中的行號(hào) Exception::getTrace — 獲取異常追蹤信息 Exception::getTraceAsString — 獲取字符串類型的異常追蹤信息 Exception::__toString — 將異常對(duì)象轉(zhuǎn)換為字符串 Exception::__clone — 異??寺?
以上部分來(lái)自官網(wǎng):http://php.net/manual/zh/clas...
下面是參考《PHP5權(quán)威編程》
try,catch,throw
異常處理使用3中語(yǔ)言結(jié)構(gòu):try,catch,throw。為了處理一個(gè)異常,需要在try代碼塊中運(yùn)行一些代碼
try{ $article->display(); }
try代碼只是PHP留意在代碼塊里的代碼運(yùn)行時(shí)產(chǎn)生的異常。如果出現(xiàn)了異常,它馬上被傳遞給緊跟著try代碼塊的一個(gè)或者更多的獲取代碼塊中:
catch(Exception $e){ die($e->getMessage()); }
變量$e似乎包含了一個(gè)對(duì)象。它包含的異常的確是對(duì)象,唯一條件就是必須從Exception類繼承。
如果想在你自己的代碼中產(chǎn)生一個(gè)異常,使用throw語(yǔ)句:
$fp = @fopen($fileName,"r"); if(!is_resource($fp)){ throw new FileException("could not open"); }
可以看出異常是個(gè)對(duì)象,throw只是簡(jiǎn)單的使用這個(gè)特定的對(duì)象作為異常的一部分
可以定義異常:
class IOException extends Exception{} class FileException extends Exception{}
異常類中不需要成員變量或者方法:你需要的所有內(nèi)容都已經(jīng)在內(nèi)置Exception類中定義了。
PHP在catch語(yǔ)句中使用所謂的“是一”關(guān)系對(duì)類的名字和異常對(duì)象做檢查。也就是,如果該異常對(duì)象是一個(gè)catch類的實(shí)例,或者其子類的實(shí)例,PHP就執(zhí)行catch代碼
如:
try{ $article->display(); }catch(IOException $e){ print "IOException"; }catch(FileException $e){ print "FileException"; }
這個(gè)例子中IOException的catch同時(shí)捕獲到IOException和FileException,因?yàn)镕ileException是從IOException繼承的
如果每一個(gè)catch都沒(méi)能捕獲到異常,那么會(huì)將該異常傳遞給調(diào)用的函數(shù),給調(diào)用的函數(shù)提供機(jī)會(huì)來(lái)捕獲。
如果異常在任何地方都沒(méi)能捕獲,那么PHP會(huì)提供最后的機(jī)會(huì):異常處理函數(shù)。默認(rèn)情況下PHP打印出錯(cuò)誤信息、類的名字和一個(gè)堆棧信息。
通過(guò)調(diào)用set_exception_handler(),可以注冊(cè)異常處理函數(shù)
function my_exception(Exception $e){ print "error is ".$e->getMessage(); exit; } set_exception_handler("my_exception");
這個(gè)函數(shù)用來(lái)處理所有沒(méi)能在catch中獲取的異常,異常處理函數(shù)中不能再拋出異常。
看看ThinkPHP中的做法:
set_exception_handler(array("Think","appException")); static public function appException($e) { halt($e->__toString()); } static public function halt($error) { $e = array(); if (APP_DEBUG || IS_CLI) { //調(diào)試模式下輸出錯(cuò)誤信息 if (!is_array($error)) { $trace = debug_backtrace(); $e["message"] = $error; $e["file"] = $trace[0]["file"]; $e["line"] = $trace[0]["line"]; ob_start(); debug_print_backtrace(); $e["trace"] = ob_get_clean(); } else { $e = $error; } if(IS_CLI){ exit(iconv("UTF-8","gbk",$e["message"]).PHP_EOL."FILE: ".$e["file"]."(".$e["line"].")".PHP_EOL.$e["trace"]); } } else { //否則定向到錯(cuò)誤頁(yè)面 $error_page = C("ERROR_PAGE"); if (!empty($error_page)) { redirect($error_page); } else { $message = is_array($error) ? $error["message"] : $error; $e["message"] = C("SHOW_ERROR_MSG")? $message : C("ERROR_MESSAGE"); } } // 包含異常頁(yè)面模板 $exceptionFile = C("TMPL_EXCEPTION_FILE",null,THINK_PATH."Tpl/think_exception.tpl"); include $exceptionFile; exit; }
在框架的入口注冊(cè)異常處理函數(shù):先引入對(duì)應(yīng)的模板文件,然后在模板文件中直接顯示出錯(cuò)誤信息
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22493.html
摘要:變量作為函數(shù)返回值時(shí),必須聲明為動(dòng)態(tài)類型。動(dòng)態(tài)變量與中的變量基本完全相同支持在使用時(shí)改變類型。比較運(yùn)算符在運(yùn)算時(shí)考慮變量類型,如果是動(dòng)態(tài)變量與一致。與不一致,語(yǔ)句可以沒(méi)有,表示忽略所有異常。 上一篇 《Zephir 簡(jiǎn)介》 簡(jiǎn)單介紹了環(huán)境搭建,編寫(xiě)了一個(gè)的簡(jiǎn)單示例。這一篇繼續(xù)介紹 Zephir 基礎(chǔ)。 基本語(yǔ)法Zephir 中,每個(gè)文件都必須有且只有一個(gè)類,每個(gè)類都必須有一個(gè)命名空間,...
摘要:當(dāng)項(xiàng)目拋出異常時(shí)操作那個(gè)方法時(shí)傳的參數(shù)執(zhí)行操作異常相關(guān)操作當(dāng)前異常類通過(guò)異常類名,我們可以知道是訂單支付異常。 引出 如果你調(diào)一個(gè)類,調(diào)用時(shí)數(shù)據(jù)驗(yàn)證時(shí)報(bào)了個(gè)錯(cuò),你會(huì)以什么方式返回 數(shù)組,布爾值? 數(shù)組這個(gè)可以帶錯(cuò)誤原因回來(lái),那布爾值呢? 返回了個(gè) false, 報(bào)錯(cuò)時(shí)把錯(cuò)誤放在類變量里?還是專門(mén)用一個(gè)獲取錯(cuò)誤的方法進(jìn)行獲?。?上面說(shuō)的情況是代碼完全沒(méi)有問(wèn)題的情況。那如果是一些第三方的工...
摘要:源碼分析錯(cuò)誤及異常處理機(jī)制錯(cuò)誤及異常處理機(jī)制文件是,在框架引導(dǎo)文件的的基礎(chǔ)文件中注冊(cè)不知道的可以去看源碼分析二入口篇,通過(guò)進(jìn)行的注冊(cè)。異常中止處理將錯(cuò)誤信息托管至寫(xiě)入日志通過(guò)獲取最后拋出的錯(cuò)誤,把信息托管至,在通過(guò)異常處理函數(shù)進(jìn)行記錄信息。 源碼分析 錯(cuò)誤及異常處理機(jī)制 錯(cuò)誤及異常處理機(jī)制文件是/thinkphp/library/think/Error.php,在框架引導(dǎo)文件的的基礎(chǔ)文...
摘要:現(xiàn)在我就用框架來(lái)進(jìn)行實(shí)戰(zhàn)下在實(shí)際業(yè)務(wù)中是如何優(yōu)雅的使用異常的場(chǎng)景描述選擇一個(gè)比較簡(jiǎn)單的業(yè)務(wù)場(chǎng)景,以登錄模塊為例,用戶在移動(dòng)端進(jìn)行登錄時(shí),需要進(jìn)行登錄,注冊(cè),忘記密碼,獲取手機(jī)驗(yàn)證碼等接口。 前言 剛開(kāi)始接觸PHP的時(shí)候沒(méi)有意識(shí)到異常的重要性,有時(shí)候出問(wèn)題很難精確的找到問(wèn)題點(diǎn),正確的處理異常也是一門(mén)學(xué)問(wèn) 異常的類別 PHP7異常做了很多變動(dòng),異常類 Exception 和錯(cuò)誤類 Erro...
摘要:關(guān)于拋出異常如在我的上一篇文中所說(shuō)的一樣在接口的設(shè)計(jì)中接口的返回的數(shù)據(jù)是非常重要的例如無(wú)法避免的等等這些都是要命的錯(cuò)誤同時(shí)還有一個(gè)極大的問(wèn)題就是在新增模塊中例如我最近需要新增一個(gè)的分詞查詢模塊這個(gè)在添加索引刪除索引等等操作的時(shí)候是非常容易導(dǎo) showImg(http://pqykjwm6s.bkt.clouddn.com/Grassland_Scenery_by_Shi_Yuejun....
閱讀 2422·2021-11-24 09:39
閱讀 3247·2021-10-09 09:53
閱讀 1138·2021-09-22 16:06
閱讀 4462·2021-09-02 10:18
閱讀 806·2021-08-23 09:42
閱讀 1770·2021-08-17 10:11
閱讀 2691·2019-08-30 13:02
閱讀 2128·2019-08-30 12:49