亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

php語(yǔ)言

php中try catch捕獲異常實(shí)例詳解

時(shí)間:2024-07-29 03:59:00 php語(yǔ)言 我要投稿
  • 相關(guān)推薦

php中try catch捕獲異常實(shí)例詳解

  導(dǎo)語(yǔ):php中try catch可以幫助我們捕獲程序代碼的異常了,這樣我們可以很好的處理一些不必要的錯(cuò)誤了,下面就由小編為大家介紹一下php中try catch捕獲異常實(shí)例詳解,歡迎大家閱讀!

  PHP中try{}catch{}語(yǔ)句概述

  PHP5添加了類(lèi)似于其它語(yǔ)言的異常處理模塊。在 PHP 代碼中所產(chǎn)生的異?杀 throw語(yǔ)句拋出并被 catch 語(yǔ)句捕獲。(注:一定要先拋才能獲。

  需要進(jìn)行異常處理的代碼都必須放入 try 代碼塊內(nèi),以便捕獲可能存在的異常。

  每一個(gè) try 至少要有一個(gè)與之對(duì)應(yīng)的 catch。

  使用多個(gè) catch可以捕獲不同的類(lèi)所產(chǎn)生的異常。

  當(dāng) try 代碼塊不再拋出異;蛘哒也坏 catch 能匹配所拋出的異常時(shí),PHP 代碼就會(huì)在跳轉(zhuǎn)到最后一個(gè) catch 的后面繼續(xù)執(zhí)行。

  當(dāng)然,PHP允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。

  當(dāng)一個(gè)異常被拋出時(shí),其后(譯者注:指拋出異常時(shí)所在的代碼塊)的代碼將不會(huì)繼續(xù)執(zhí)行,而 PHP 就會(huì)嘗試查找第一個(gè)能與之匹配的 catch。

  如果一個(gè)異常沒(méi)有被捕獲,而且又沒(méi)用使用 set_exception_handler() 作相應(yīng)的處理的話,那么 PHP 將會(huì)產(chǎn)生一個(gè)嚴(yán)重的錯(cuò)誤,并且輸出 Uncaught Exception ... (未捕獲異常)的提示信息。

  先來(lái)看一下PHP內(nèi)置異常類(lèi)的基本屬性和方法。(不包括具體實(shí)現(xiàn))

  復(fù)制代碼代碼如下: try{

  }

  catch(){

  throw new Exception();

  }

  catch(){

  //這里可以捕獲到前面一個(gè)塊拋出的Exception

  }

  為了進(jìn)一步處理異常,我們需要使用PHP中try{}catch{}----包括Try語(yǔ)句和至少一個(gè)的catch語(yǔ)句。任何調(diào)用 可能拋出異常的方法的代碼都應(yīng)該使用try語(yǔ)句。Catch語(yǔ)句用來(lái)處理可能拋出的異常。以下顯示了我們處理getCommandObject()拋出的異常的方法:

  復(fù)制代碼代碼如下:try {

  $mgr = new CommandManager();

  $cmd = $mgr->getCommandObject("realcommand");

  $cmd->execute();

  } catch (Exception $e) {

  print $e->getMessage();

  exit();

  }

  ?>

  可以看到,通過(guò)結(jié)合使用throw關(guān)鍵字和PHP中try{}catch{},我們可以避免錯(cuò)誤標(biāo)記“污染”類(lèi)方法返回的值。因?yàn)椤爱惓!北旧砭褪且环N與其它任何對(duì)象不同的PHP內(nèi)建的類(lèi)型,不會(huì)產(chǎn)生混淆。

  如果拋出了一個(gè)異常,try語(yǔ)句中的腳本將會(huì)停止執(zhí)行,然后馬上轉(zhuǎn)向執(zhí)行catch語(yǔ)句中的腳本。

  例子如下:

  包含文件錯(cuò)誤拋出異常

  復(fù)制代碼代碼如下:// 錯(cuò)誤的演示

  try {

  require ('test_try_catch.php');

  } catch (Exception $e) {

  echo $e->getMessage();

  }

  // 正確的拋出異常

  try {

  if (file_exists('test_try_catch.php')) {

  require ('test_try_catch.php');

  } else {

  throw new Exception('file is not exists');

  }

  } catch (Exception $e) {

  echo $e->getMessage();

  }

  如果異常拋出了卻沒(méi)有被捕捉到,就會(huì)產(chǎn)生一個(gè)fatal error。

  多個(gè)catch捕獲多個(gè)異常

  PHP將查詢(xún)一個(gè)匹配的catch代碼塊。如果有多個(gè)catch代碼塊,傳遞給每一個(gè)catch代碼塊的對(duì)象必須具有不同類(lèi)型,這樣PHP可以找到需要進(jìn)入哪一個(gè)catch代碼塊。當(dāng)try代碼塊不再拋出異;蛘哒也坏絚atch能匹配所拋出的異常時(shí),PHP代碼就會(huì)在跳轉(zhuǎn)最后一個(gè)catch的后面繼續(xù)執(zhí)行。多個(gè)異常的捕獲的示例如下:

  復(fù)制代碼代碼如下:class MyException extends Exception{

  //重定義構(gòu)造器使第一個(gè)參數(shù)message變?yōu)楸仨毐恢付ǖ膶傩?/p>

  public function __construct($message, $code=0){

  //可以在這里定義一些自己的代碼

  //建議同時(shí)調(diào)用parent::construct()來(lái)檢查所有的變量是否已被賦值

  parent::__construct($message, $code);

  }

  //重寫(xiě)父類(lèi)中繼承過(guò)來(lái)的方法,自定義字符串輸出的樣式

  public function __toString(){

  return __CLASS__.":[".$this->code."]:".$this->message."

  ";

  }

  //為這個(gè)異常自定義一個(gè)處理方法

  public function customFunction(){

  echo "按自定義的方法處理出現(xiàn)的這個(gè)類(lèi)型的異常";

  }

  }

  //創(chuàng)建一個(gè)用于測(cè)試自定義擴(kuò)展的異常類(lèi)MyException

  class TestException{

  public $var; //用來(lái)判斷對(duì)象是否創(chuàng)建成功的成員屬性

  function __construct($value=0){ //通過(guò)構(gòu)造方法的傳值決定拋出的異常

  switch($value){ //對(duì)傳入的值進(jìn)行選擇性的判斷

  case 1: //摻入?yún)?shù)1,則拋出自定義的異常對(duì)象

  throw new MyException("傳入的值“1”是一個(gè)無(wú)效的參數(shù)",5);break;

  case 2: //傳入?yún)?shù)2,則拋出PHP內(nèi)置的異常對(duì)象

  throw new MyException("傳入的值“2”不允許作為一個(gè)參數(shù)",6);break;

  default: //傳入?yún)?shù)合法,則不拋出異常

  $this->var=$value;break; //為對(duì)象中的成員屬性賦值

  }

  }

  }

  //示例1,在沒(méi)有異常時(shí),程序正常執(zhí)行,try中的代碼全部執(zhí)行并不會(huì)執(zhí)行任何catch區(qū)塊

  try{

  $testObj =new TestException(); //使用默認(rèn)參數(shù)創(chuàng)建異常的擦拭類(lèi)對(duì)象

  echo "********

  "; //沒(méi)有拋出異常這條語(yǔ)句就會(huì)正常執(zhí)行

  }catch(MyException $e){ //捕獲用戶(hù)自定義的異常區(qū)塊

  echo "捕獲自定義的異常:$e

  "; //按自定義的方式輸出異常消息

  $e->customFunction(); //可以調(diào)用自定義的異常處理方法

  }catch(Exception $e){ //捕獲PHP內(nèi)置的異常處理類(lèi)的對(duì)象

  echo "捕獲默認(rèn)的異常:".$e->getMessage()."

  "; //輸出異常消息

  }

  var_dump($testObj); //判斷對(duì)象是否創(chuàng)建成功,如果沒(méi)有任何異常,則創(chuàng)建成功

  //示例2,拋出自定義的異常,并通過(guò)自定義的異常處理類(lèi)捕獲這個(gè)異常并處理

  try{

  $testObj1 =new TestException(1); //傳1時(shí),拋出自定義異常

  echo "********

  "; //這個(gè)語(yǔ)句不會(huì)被執(zhí)行

  }catch(MyException $e){ //這個(gè)catch區(qū)塊中的代碼將被執(zhí)行

  echo "捕獲自定義的異常:$e

  ";

  $e->customFunction();

  }catch(Exception $e){ //這個(gè)catch區(qū)塊不會(huì)執(zhí)行

  echo "捕獲默認(rèn)的異常:".$e->getMessage()."

  ";

  }

  var_dump($testObj1); //有異常產(chǎn)生,這個(gè)對(duì)象沒(méi)有創(chuàng)建成功

  //示例2,拋出自?xún)?nèi)置的異常,并通過(guò)自定義的異常處理類(lèi)捕獲這個(gè)異常并處理

  try{

  $testObj2 =new TestException(2); //傳入2時(shí),拋出內(nèi)置異常

  echo "********

  "; //這個(gè)語(yǔ)句不會(huì)被執(zhí)行

  }catch(MyException $e){ //這個(gè)catch區(qū)塊中的代碼將被執(zhí)行

  echo "捕獲自定義的異常:$e

  ";

  $e->customFunction();

  }catch(Exception $e){ //這個(gè)catch區(qū)塊不會(huì)執(zhí)行

  echo "捕獲默認(rèn)的異常:".$e->getMessage()."

  ";

  }

  var_dump($testObj2); //有異常產(chǎn)生,這個(gè)對(duì)象沒(méi)有創(chuàng)建成功

  ?>

  在上面的代碼中,可以使用兩個(gè)異常處理類(lèi):一個(gè)是自定義的異常處理類(lèi)MyException;另一個(gè)則是PHP中內(nèi)置的異常處理類(lèi)Exception。分別在try區(qū)塊中創(chuàng)建測(cè)試類(lèi)TestException的對(duì)象,并根據(jù)構(gòu)造方法中提供的不同數(shù)字參數(shù),拋出自定義異常類(lèi)對(duì)象、內(nèi)置的異常類(lèi)對(duì)象和不拋出任何異常的情況,跳轉(zhuǎn)到對(duì)應(yīng)的catch區(qū)塊中執(zhí)行。如果沒(méi)有異常發(fā)生,則不會(huì)進(jìn)入任何一個(gè)catch塊中執(zhí)行,測(cè)試類(lèi)TestException的對(duì)象創(chuàng)建成功

【php中try catch捕獲異常實(shí)例詳解】相關(guān)文章:

PHP7的異常處理詳解08-16

PHP5異常處理分析實(shí)例08-07

php中fsockopen用法實(shí)例06-20

php中return的用法實(shí)例分析10-27

php中實(shí)現(xiàn)回刪功能實(shí)例10-03

PHP中檢測(cè)ajax請(qǐng)求的代碼實(shí)例10-25

PHP7系列中的異常處理08-11

php畫(huà)圖實(shí)例07-16

PHP實(shí)用的代碼實(shí)例08-12

php查詢(xún)mysql的實(shí)例09-09