PHP 錯誤消息處理 & 異常消息處理 -- (學(xué)習(xí)筆記)

PHP 錯誤處理
1、使用 die() 函數(shù)

<?php
if(!file_exists("welcome.txt")){ //如果目標(biāo)文件不存在
 die("File not found");  //給出錯誤信息
} else {  //否則
 $file=fopen("welcome.txt","r");  //打開目標(biāo)文件
}
?>

2送火、使用 trigger_error() 函數(shù)
在腳本中用戶輸入數(shù)據(jù)的位置烈钞,當(dāng)用戶的輸入無效時完成觸發(fā)。

<?php
$test=2;
if ($test>1){
  trigger_error("Value must be 1 or below");
}
?>

3捎拯、通過使用 error_log() 函數(shù)泪幌,可以向指定的文件或遠(yuǎn)程目的地發(fā)送錯誤記錄。

PHP異常處理

當(dāng)異常被觸發(fā)時署照,通常會發(fā)生:

  • 當(dāng)前代碼狀態(tài)被保存
  • 代碼執(zhí)行被切換到預(yù)定義的異常處理器函數(shù)
  • 根據(jù)情況祸泪,處理器也許會從保存的代碼狀態(tài)重新開始執(zhí)行代碼,終止腳本執(zhí)行藤树,或從代碼中另外的位置繼續(xù)執(zhí)行腳本

1浴滴、異常的基本使用
當(dāng)異常被拋出時,其后的代碼不會繼續(xù)執(zhí)行岁钓,PHP 會嘗試查找匹配的 "catch" 代碼塊升略。
如果異常沒有被捕獲微王,而且又沒用使用 set_exception_handler() 作相應(yīng)的處理的話,那么將發(fā)生一個嚴(yán)重的錯誤(致命錯誤)品嚣,并且輸出 "Uncaught Exception" (未捕獲異常)的錯誤消息炕倘。

錯誤例子:沒有對對發(fā)出的異常進(jìn)行捕獲
<?php
function checkNum($number){
  if($number>1){
    throw new Exception("Value must be 1 or below");  //發(fā)出異常警告
   }
  return true;
}
checkNum(2);  //調(diào)用函數(shù)
?>

要避免上面例子出現(xiàn)的錯誤,我們需要創(chuàng)建適當(dāng)?shù)拇a來處理異常翰撑。正確的處理程序應(yīng)當(dāng)包括:

  • Try - 使用異常的函數(shù)應(yīng)該位于 "try" 代碼塊內(nèi)罩旋。如果沒有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行眶诈。但是如果異常被觸發(fā)涨醋,會拋出一個異常。
  • Throw - 這里規(guī)定如何觸發(fā)異常逝撬。每一個 "throw" 必須對應(yīng)至少一個 "catch"
  • Catch - "catch" 代碼塊會捕獲異常浴骂,并創(chuàng)建一個包含異常信息的對象
<?php
function checkNum($number) { //創(chuàng)建可拋出一個異常的函數(shù)
 if($number>1) {
  throw new Exception("Value must be 1 or below"); //拋出異常
 }
 return true;
}

try {
 checkNum(2);//在 "try" 代碼塊中觸發(fā)異常
 echo 'If you see this, the number is 1 or below'; //意思是:如果看見這句話,表示輸入的數(shù)字 <= 1宪潮;
 }

//捕獲異常
catch(Exception $e) { //"catch" 代碼塊接收到該異常溯警,并創(chuàng)建一個包含異常信息的對象 ($e)。
 echo 'Message: ' .$e->getMessage();  //通過從這個 exception 對象調(diào)用 $e->getMessage()狡相,輸出來自該異常的錯誤消息
}
?>
 //打犹萸帷:Message: Value must be 1 or below 
注釋:必須遵循 每個throw 必須對應(yīng)一個 catch 的原則 !>∽亍喳挑!
但是為了防止有錯誤信息遺漏,可以設(shè)置一個頂層的異常處理器來處理漏掉的錯誤萄金。

2蟀悦、如果有多個異常

<?php
class customException extends Exception{ // 通過Extension 創(chuàng)建一個其拓展類 customException
  public function errorMessage(){ //errorMessage 定義返回異常信息的函數(shù)
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "someone@example.com"; //定義Email地址

try {
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
  throw new customException($email); //如果Email地址不合法媚朦,則發(fā)出此錯誤信息
 }
 if(strpos($email, "example") !== FALSE){ //查詢Email地址中有沒有 example 字樣
  throw new Exception("$email is an example e-mail");
 }
}
catch (customException $e) { //捕捉異常
 echo $e->errorMessage();
}
catch(Exception $e) { //如果上面沒有捕捉到 customException 異常氧敢,在這里進(jìn)行處理
 echo $e->getMessage();
}
?>

3、重新拋出對用戶友好的異常消息

<?php
class customException extends Exception { // 通過Extension 創(chuàng)建一個其拓展類 customException
 public function errorMessage() {
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; //異常消息:E-Mail 地址無效
  return $errorMsg;
 }
}

$email = "someone@example.com";

//"try" 代碼塊包含另一個 "try" 代碼塊询张,這樣就可以再次拋出異常孙乖。
try {
 try {
  if(strpos($email, "example") !== FALSE) { //查詢Email地址中有沒有 example 字樣
   throw new Exception($email);
  }
 }
 // "catch" 捕獲到該異常,并重新拋出 "customException"份氧。
 catch(Exception $e) {
  throw new customException($email);
 }
}

//捕獲到 "customException"唯袄,并顯示一條錯誤消息。
catch (customException $e) {
 echo $e->errorMessage();
}
?>

異常的規(guī)則:

  • 需要進(jìn)行異常處理的代碼應(yīng)該放入 try 代碼塊內(nèi)蜗帜,以便捕獲潛在的異常恋拷。
  • 每個 try 或 throw 代碼塊必須至少擁有一個對應(yīng)的 catch 代碼塊。
  • 使用多個 catch 代碼塊可以捕獲不同種類的異常厅缺。
  • 可以在 try 代碼塊內(nèi)的 catch 代碼塊中再次拋出(re-thrown)異常蔬顾。

簡而言之:如果拋出了異常宴偿,就必須捕獲它。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诀豁,一起剝皮案震驚了整個濱河市窄刘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舷胜,老刑警劉巖娩践,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烹骨,居然都是意外死亡翻伺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門沮焕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆趴,“玉大人,你說我怎么就攤上這事遇汞∥疵茫” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵空入,是天一觀的道長络它。 經(jīng)常有香客問我,道長歪赢,這世上最難降的妖魔是什么化戳? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮埋凯,結(jié)果婚禮上点楼,老公的妹妹穿的比我還像新娘。我一直安慰自己白对,他們只是感情好掠廓,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甩恼,像睡著了一般蟀瞧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上条摸,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天悦污,我揣著相機(jī)與錄音,去河邊找鬼钉蒲。 笑死切端,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顷啼。 我是一名探鬼主播踏枣,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼小压,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了椰于?” 一聲冷哼從身側(cè)響起怠益,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘾婿,沒想到半個月后蜻牢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡偏陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年抢呆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笛谦。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡抱虐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饥脑,到底是詐尸還是另有隱情恳邀,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布灶轰,位于F島的核電站谣沸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笋颤。R本人自食惡果不足惜乳附,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伴澄。 院中可真熱鬧赋除,春花似錦、人聲如沸非凌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽清焕。三九已至并蝗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秸妥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工沃粗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留粥惧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓最盅,卻偏偏與公主長得像突雪,于是被迫代替她去往敵國和親起惕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 八咏删、深入理解java異常處理機(jī)制 引子try…catch…finally恐怕是大家再熟悉不過的語句了惹想, 你的答案是...
    壹點零閱讀 1,573評論 0 0
  • 異常(Exception)用于在指定的錯誤發(fā)生時改變腳本的正常流程。 什么是異常督函? PHP 5 提供了一種新的面向...
    josephok閱讀 574評論 0 7
  • NodeJS 的錯誤處理讓人痛苦嘀粱,在很長的一段時間里,大量的錯誤被放任不管辰狡。但是要想建立一個健壯的 Node.js...
    宮若石閱讀 802評論 0 3
  • 杜小康家是油麻地鎮(zhèn)最富有的人家锋叨,每當(dāng)學(xué)校有活動,不可必免會有幾個孩子忘拿學(xué)校讓帶的工具,這時杜小康總是去他們家的商...
    成長08閱讀 138評論 0 0
  • 在工作中會遇到各種各樣的事情宛篇,不同的人娃磺。但是當(dāng)你從事軟件測試這一工作的時候你就會發(fā)現(xiàn),不同的事情叫倍,不同的人還有各種...
    檸檬班軟件測試閱讀 341評論 0 1