欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

詳細(xì)解讀php的異常處理機(jī)制

異常機(jī)制

成都服務(wù)器托管,創(chuàng)新互聯(lián)建站提供包括服務(wù)器租用、內(nèi)江機(jī)房主機(jī)托管、帶寬租用、云主機(jī)、機(jī)柜租用、主機(jī)租用托管、CDN網(wǎng)站加速、域名注冊(cè)等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:028-86922220

 

一.異?;局R(shí)

1.定義:異常處理用于在指定的錯(cuò)誤(異常)情況發(fā)生時(shí)改變腳本的正常流程,這過(guò)程稱為異常.

2.基本用法:

 try

{

 //可能出現(xiàn)的錯(cuò)誤(異常)代碼

 }

 catch(Exception $e)

{

//自己處理:捕捉異常并處理,

//自己不處理:拋出一個(gè)異常,即如下:

  throw $e;

}

 

其中,Exception是異常類(php中定義好的一個(gè)類,具體參見php參考文檔:語(yǔ)音參考->異常處理).它已經(jīng)封裝好很多方法,常用如下:

        function __construct($message = null, $code = 0);

    final function getMessage();                // 返回異常信息

    final function getCode();                   // 返回異常代碼

    final function getFile();                   // 返回發(fā)生異常的文件名

    final function getLine();                   // 返回發(fā)生異常的代碼行號(hào)

    final function getTrace();                  // backtrace() 數(shù)組

    final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

 

    /* 可重載的方法 */

    function __toString();                       // 可輸出的字符串

 

 

3.入門案例

 

案例1:

<?php
 try{
 adduser("weimin");
 echo "adduser()如果出現(xiàn)異常,這句話就不會(huì)出現(xiàn)<br>";
 updateuser("wly1");
 echo "updateuser()如果出現(xiàn)異常,這句話就不會(huì)出現(xiàn)<br>";
 }
 catch(Exception $e)
 {
 echo "error!".$e->getMessage();
 //getMessage()為異常中一個(gè)函數(shù),可返回異常信息
 }
 function adduser($username)
 {
 if($username=="weimin")
 {
 
 }
 else
 {
 throw new Exception("添加失敗");//拋出異常,及返回一個(gè)異常
 }
 }
 function updateuser($username)
 {
 if($username=="wly")
 {
 
 }
 else
 {
 throw new Exception("修改失敗");//拋出異常
 }
 }
?>

 

結(jié)果:

 

adduser()如果出現(xiàn)異常,這句話就不會(huì)出現(xiàn)

error!修改失敗

 

來(lái)自 <http://localhost/exception/exception01.php>

 

 

二.異常使用的注意事項(xiàng)

1.異常的基本處理:

 (1).當(dāng)異常被拋出,其后的代碼不會(huì)繼續(xù)執(zhí)行,php嘗試查找匹配的catch代碼塊;見案例1.

(2).如果異常沒有被捕獲,而且有沒有使用set_exception_handler()做相應(yīng)的處理,那么會(huì)發(fā)生一個(gè)嚴(yán)重的錯(cuò)誤(致命錯(cuò)誤),并輸出"Uncaught Exception"(未捕獲異常)的錯(cuò)誤消息;

(3).當(dāng)catch一個(gè)異常,可以進(jìn)行處理或者不進(jìn)行處理(在catch函數(shù)中,直接拋出異常,即 throw $e,這時(shí)將啟動(dòng)php系統(tǒng)默認(rèn)異常處理器(函數(shù))來(lái)處理,見案例2?;蛘咦约憾x一個(gè)頂級(jí)異常處理器(函數(shù)),見案例3);

    通俗理解:即第一次拋出異常后,使用try{},ctach{}捕獲到第一次拋出的異常,這時(shí)我們?nèi)绻粚?duì)第一次拋出的異常進(jìn)行處理,可以將此異常進(jìn)行第二次拋出,這時(shí),此異常將交給php默認(rèn)異常處理器(函數(shù))進(jìn)行處理,或者交給用戶自己定義的頂級(jí)異常處理器(函數(shù))進(jìn)行處理。

其中,定義頂級(jí)異常處理,需要兩個(gè)步驟:

步驟一:定義頂級(jí)異常處理函數(shù);

步驟二:修改默認(rèn)定義異常處理函數(shù)set_exception_handler("函數(shù)名");

 

案例2:

<?php
  function A1($val)
  {
  if($val=="A")
  {
 
throw new Exception ("不要輸入A");//第一次拋出異常
  }
  }
   function B1($val)
  {
  if($val=="B")
  {
 
throw new Exception ("不要輸入B");//第一次拋出異常
  }
  }
  try
  {
  A1("A");
  }
  catch(Exception $e)
  {
 
throw $e; //第二次拋出異常
 
/*捕獲異常后,繼續(xù)拋出異常(第二次拋出異常),這時(shí)候?qū)?huì)啟動(dòng)php默認(rèn)的異常處理器來(lái)處理,
  也可以自己定義一個(gè)頂級(jí)異常處理*/
  }
?>

結(jié)果:

Fatal error: Uncaught exception 'Exception' with message '不要輸入A' in E:\Software_default\wamp_wwwroot\exception\exception02.php:6 Stack trace: #0 E:\Software_default\wamp_wwwroot\exception\exception02.php(18): A1('A') #1 {main} thrown in E:\Software_default\wamp_wwwroot\exception\exception02.phpon line 6

 

來(lái)自 <http://localhost/exception/exception02.php>

 

案例3:

<?php
 
 function MyException($e)//用戶定義的頂級(jí)異常處理函數(shù)
  {
 
echo "<b>我是頂級(jí)異常處理函數(shù),</b>其中,異常信息為:".$e->getMessage();
  }
 
set_exception_handler("MyException");//修改默認(rèn)的頂級(jí)異常處理函數(shù)
  function A1($val)
  {
  if($val=="A")
 throw new Exception ("不要輸入A");//拋出異常
  }
   function B1($val)
  {
  if($val=="B")
   
throw new Exception ("不要輸入B");  
  }
  try
  {
  A1("A");
  }
  catch(Exception $e)
  {
  throw $e;
 
/*繼續(xù)拋出異常,這時(shí)候?qū)?huì)啟動(dòng)php默認(rèn)的異常處理器來(lái)處理,
  也可以自己定義一個(gè)頂級(jí)異常處理*/
  }
?>

結(jié)果:

 

我是頂級(jí)異常處理函數(shù),其中,異常信息為:不要輸入A

 

來(lái)自 <http://localhost/exception/exception03.php>

(4).如果拋出一個(gè)異常,就必須捕獲它(否則會(huì)報(bào)錯(cuò),產(chǎn)生Fatal error錯(cuò)誤),或者使用用戶定義的頂級(jí)異常處理函數(shù)進(jìn)行處理

2.也可以自己定義一個(gè)異常類

 

class MyException Exception

{

}

3.使用多個(gè)catch代碼塊可以捕獲不同種類的異常

(1).基本用法

 try

{

 //代碼

  //可能拋出多種異常

}

 catch(PDOException $e)//數(shù)據(jù)庫(kù)異常

{

  //代碼

}

 catch(Exception $e)

{

  //代碼

}

(2).案例

 

案例4:

<?php
   //定義一個(gè)異常類
   class MyException1 extends Exception{
  
   }
    class MyException2 extends Exception{
  
   }
  
   function A()
   {
   throw new MyException1("a");
   }
   function B()
   {
   throw new MyException1("b");
   }
    function C()
   {
   try{
  
A();//拋出MyException1
  
B();//拋出MyException2
   }
   catch(Exception1 $e1){
   echo $e1->getMessage();
   }
   catch(Exception2 $e2){
   echo $e2>getMessage();
   }
   }
   C();
?>

 

結(jié)果:

 

Fatal error: Uncaught exception 'MyException1' with message 'a' in E:\Software_default\wamp_wwwroot\exception\exception04.php:12 Stack trace: #0 E:\Software_default\wamp_wwwroot\exception\exception04.php(21): A() #1 E:\Software_default\wamp_wwwroot\exception\exception04.php(31): C() #2 {main} thrown in E:\Software_default\wamp_wwwroot\exception\exception04.phpon line 12

 

來(lái)自 <http://localhost/exception/exception04.php>

由于產(chǎn)生不捕獲的異常,php默認(rèn)顯示其異常處理函數(shù),這時(shí),我們添加用戶自定義的頂級(jí)處理函數(shù)

 

案例5:

 

<?php
    //定義一個(gè)異常類  
   class MyException1 extends Exception{  
   
   }
    class MyException2 extends Exception{  
    
   }
    function MyException($e)
  {
 
      echo "<b>我是頂級(jí)異常處理函數(shù),</b>其中,異常信息為:".$e->getMessage();
  }
 
set_exception_handler("MyException");//修改默認(rèn)的頂級(jí)異常處理函數(shù)
   function A()
   {
   throw new MyException1("a");
   }
   function B()
   {
   throw new MyException1("b");
   }
    function C()
   {
   try{
  
A();//拋出MyException1
  
B();//拋出MyException2
   }
  
catch(Exception1 $e1){//Exception1 是異常類名
   echo $e1->getMessage();
   }
  
catch(Exception2 $e2){//Exception2是異常類名
   echo $e2>getMessage();
   }
   }
   C();
?>

結(jié)果:

 

我是頂級(jí)異常處理函數(shù),其中,異常信息為:a

 

來(lái)自 <http://localhost/exception/exception05.php>

 

 

3.PHP異常拋出的BUG

 

案例6:

<?php
try{
$a=8/0;
}
catch(Exception $e){
echo
$e->getMessage();
echo "異常";
}
?>

 

結(jié)果:

Warning: Division by zero in E:\Software_default\wamp_wwwroot\exception\exception06.phpon line 3

 

來(lái)自 <http://localhost/exception/exception06.php>

 

在案例6中,8/0,php認(rèn)為是錯(cuò)誤,而不是異常,所以,沒有拋出異常,因此捕獲不到異常

案例7:

<?php
try{
$f=fopen("aa.txt","r");//aa.txt在當(dāng)前路徑下并不存在
}
catch(Exception $e){
echo
$e->getMessage();
echo "異常";
}
?>

結(jié)果:

Warning: fopen(aa.txt) [function.fopen]: failed to open stream: No such file or directory in E:\Software_default\wamp_wwwroot\exception\exception07.phpon line 3

 

 

來(lái)自 <http://localhost/exception/exception07.php>

在案例7中, fopen()是一個(gè)很老的函數(shù),從php1就已經(jīng)存在了,當(dāng)時(shí)并沒有異常處理機(jī)制,php認(rèn)為是錯(cuò)誤,而不是異常,所以,沒有拋出異常,因此捕獲不到異常

 

 

 

附件:http://down.51cto.com/data/2367733

網(wǎng)頁(yè)名稱:詳細(xì)解讀php的異常處理機(jī)制
分享鏈接:http://aaarwkj.com/article12/jjgjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、小程序開發(fā)、域名注冊(cè)、定制開發(fā)、外貿(mào)建站關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
国产在线一区二区三区蜜桃| 精品人妻一区二区在线99| 日本午夜福利视频在线观看| 亚洲色图视频免费观看| 一二三日韩电影在线观看| 91中文在线观看一区| 一级黄片国产精品久久| 国产一区在线免费在线观看| 白天躁晚上躁天天躁在线| 久久精品一区二区婷婷| 日韩欧美亚洲精品中文字幕αv| 亚洲一区欧美二区日韩三区| 久久国产成人精品免费看| 日本加勒比一道本东京热| 国产丝袜在线精品丝袜不卡| 国产a级一区二区三区| 日本精品女优一区二区三区四区| 国产欧美色日韩综合在线| 亚洲精品一区二区播放| 在线观看成人激情视频| 国产传媒在线免费播放| 国产高清自拍视频在线一区| 日本特黄特黄录像在线| 日韩特级黄片在线免费观看| 国产夫妻性生活视频播放 | 亚洲欧洲成熟熟女妇专区乱| 亚洲精品影视一区二区| 黄色污网站在线观看免费| 日本一区二区三区日韩欧美| 亚洲精品香蕉久久情趣| 传媒视频在线观看网站| 一区二区三区免费在线观看视频| 久久精品国产精油按摩| 国产亚洲精品视频在线网| 国产激情久久久久久影院| 国产色视频一区在线观看| 97精品久久九九中文字幕| 18岁禁看网站在线看| 欧美日韩一区二区三区四区高清视频 | 午夜日本大胆裸体艺术| 国产女主播在线观看一区|