PHP異常

拋出一個(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ò)誤消息

使用實(shí)例:

<?php
$filename = 'test.txt';
try {
    if (!file_exists($filename)) {
      throw new Exception('文件不存在');
    }
} catch(Exception $e) {
    echo $e->getMessage();
}

異常處理類

PHP具有很多異常處理類,其中Exception是所有異常處理的基類淮逻。

Exception具有幾個(gè)基本屬性與方法琼懊,其中包括了:

屬性 描述
message 異常消息內(nèi)容
code 異常代碼
file 拋出異常的文件名
line 拋出異常在該文件的行數(shù)

其中常用的方法有:

方法 描述
getTrace 獲取異常追蹤信息
getTraceAsString 獲取異常追蹤信息的字符串
getMessage 獲取出錯(cuò)信息

如果必要的話,可以通過繼承Exception類來建立自定義的異常處理類爬早。

<?php
class MyException extends Exception {
    function getInfo() {
        return '自定義錯(cuò)誤信息';
    }
}

try {
    throw new MyException('error');
} catch(Exception $e) {
    echo $e->getInfo();
}

捕獲異常信息

在了解了異常處理的基本原理之后哼丈,我們可以通過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í)行其他代碼';

獲取錯(cuò)誤發(fā)生的所在行

在異常被捕獲之后,我們可以通過異常處理對(duì)象獲取其中的異常信息簇搅,前面我們已經(jīng)了解捕獲方式完域,以及獲取基本的錯(cuò)誤信息。

在實(shí)際應(yīng)用中瘩将,我們通常會(huì)獲取足夠多的異常信息吟税,然后寫入到錯(cuò)誤日志中。

通過我們需要將報(bào)錯(cuò)的文件名姿现、行號(hào)肠仪、錯(cuò)誤信息、異常追蹤信息等記錄到日志中建钥,以便調(diào)試與修復(fù)問題藤韵。

將異常信息寫入到錯(cuò)誤日志中。

示例:

<?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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熊经,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欲险,更是在濱河造成了極大的恐慌镐依,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件天试,死亡現(xiàn)場(chǎng)離奇詭異槐壳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喜每,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門务唐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人带兜,你說我怎么就攤上這事枫笛。” “怎么了刚照?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵刑巧,是天一觀的道長。 經(jīng)常有香客問我无畔,道長啊楚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任浑彰,我火速辦了婚禮恭理,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郭变。我一直安慰自己颜价,他們只是感情好薄风,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拍嵌,像睡著了一般遭赂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上横辆,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天撇他,我揣著相機(jī)與錄音,去河邊找鬼狈蚤。 笑死困肩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脆侮。 我是一名探鬼主播锌畸,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼靖避!你這毒婦竟也來了潭枣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤幻捏,失蹤者是張志新(化名)和其女友劉穎盆犁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篡九,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谐岁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榛臼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伊佃。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沛善,靈堂內(nèi)的尸體忽然破棺而出航揉,到底是詐尸還是另有隱情,我是刑警寧澤路呜,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布迷捧,位于F島的核電站,受9級(jí)特大地震影響胀葱,放射性物質(zhì)發(fā)生泄漏漠秋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一抵屿、第九天 我趴在偏房一處隱蔽的房頂上張望庆锦。 院中可真熱鬧,春花似錦轧葛、人聲如沸搂抒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽求晶。三九已至焰雕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芳杏,已是汗流浹背矩屁。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爵赵,地道東北人吝秕。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像空幻,于是被迫代替她去往敵國和親烁峭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 異常(Exception)用于在指定的錯(cuò)誤發(fā)生時(shí)改變腳本的正常流程秕铛。 什么是異常约郁? PHP 5 提供了一種新的面向...
    josephok閱讀 574評(píng)論 0 7
  • 異常與錯(cuò)誤的區(qū)別 關(guān)于異常處理這一塊,在官方的手冊(cè)上介紹的不夠詳細(xì)如捅,所以我在這里再做一個(gè)相對(duì)詳細(xì)一點(diǎn)的總結(jié)...
    四月不見閱讀 2,229評(píng)論 0 10
  • 1.拋出一個(gè)異常 從PHP5開始棍现,PHP支持 異常處理 ,異常處理是面向?qū)ο蟮囊粋€(gè)重要特性镜遣,PHP代碼中的異常通過...
    蘇宇lovecc閱讀 948評(píng)論 0 2
  • 通俗編程——白話JAVA異常機(jī)制 - 代碼之道,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語閱讀 3,179評(píng)論 0 25
  • 從PHP5開始士袄,PHP支持異常處理悲关,異常處理是面向?qū)ο笠粋€(gè)重要特性,PHP代碼中的異常通過throw拋出娄柳,異常拋出...
    charmingcheng閱讀 291評(píng)論 0 0