首頁  >  文章  >  後端開發  >  php捕捉特定類型的異常詳解

php捕捉特定類型的異常詳解

*文
*文原創
2018-01-02 17:47:221551瀏覽

異常捕捉在現在很多ide工具裡都可以用快捷鍵很方便的添加上,防止用戶看到自己看不懂的報錯甚至莫名其妙崩潰,導致用戶體驗不好。就算顯示一個友好一些的崩潰提示,也比直接顯示error:xxxx xxxxxxxxx要好得多。本文將詳細介紹php如何拋出異常與捕捉特定類型的異常,希望對大家有幫助。

什麼是異常?

PHP 5 提供了一種新的物件導向的錯誤處理方法。

異常處理用於在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱為異常。

當例外觸發時,通常會發生:

      在目前程式碼狀態儲存

#     程式碼執行切換到預先定義的異常處理器函數

      根據情況,處理器也許會從已儲存的程式碼狀態重新開始執行程式碼,終止腳本執行,或從程式碼中另外的位置繼續執行腳本

我們將展示不同的錯誤處理方法:

      例外的基本使用

##      建立自訂的例外處理器


      多個例外處理


#      重新拋出例外狀況


     設定頂層異常處理器

#     設定頂層異常處理器
##php出異常與捕捉特定類型的異常最終的目的還是要給出對應的解決辦法,讓程式碼可以繼續運作。

本文的測試環境:PHP5.5.36  Safari 9.1.2

 1 <?php
 2 header("content-type:text/html; charset=utf-8");
 3 /**
 4 * 包裹重量异常
 5 */
 6 class HeavyParcelException extends Exception {}
 7 
 8 /**
 9 * 包裹类
10 */
11 class Parcel {
12 
13   /**
14   * 包裹寄送目的地地址
15   */
16   public $address;
17 
18   /**
19   * 包裹重量
20   */
21   public $weight;
22 }
23 
24 /**
25 * 派送员
26 */
27 class Courier {
28  
29   /** 
30   * 运送
31   */
32   public function ship(Parcel $parcel) {
33     //check we have an address
34     //如果包裹的目的地为空
35     if(empty($parcel->address)) {
36       throw new Exception(&#39;address not Specified(未填写地址)!&#39;);
37     } 
38 
39     //check the weight
40     //如果重量超过5
41     if($parcel->weight > 5) {
42       throw new HeavyParcelException(&#39;Parcel exceeds courier limit(包裹超过运送上限)!&#39;);
43     } 
44 
45     //otherwise we&#39;re coll
46     return true;
47   }
48 }
49 
50 $myCourier = new Courier();
51 $parcel = new Parcel();
52 //add the address if we have it 为了测试这里不填写地址
53 $parcel->weight = 7;
54 try {
55   $myCourier->ship($parcel);
56   echo "parcel shipped";
57 } catch (HeavyParcelException $e) {//捕获HeavyParcelException 不写这个异常的类型名字,就跑到普通Exception抛出去了
58   echo "Parcel weight error(重量错误): " . $e->getMessage();
59   //redirect them to choose another courier
60 } catch (Exception $e) {
61   echo "Someting went wrong(地址错误): " . $e->getMessage();
62   //exit so we don&#39;t try to proceed any further
63   exit;
64 }
65 echo &#39;<br/>&#39;;
66 $a = 123;
67 echo $a;
從54行開始的程式碼執行順序:

55 >

32 >

35(ship方法中先檢查的是位址為空,這裡會拋出Exception,而非57行的HeavyParcelException

) >

60(捕獲到Exception

) >

616263 輸出位址錯誤exit

;不會輸出65到67行了

 Tips:

# 我覺得這一塊最重要的就是搞清楚程式碼執行的順序。寫幾段,然後改一改跑一跑。

 1.捕獲的順序,要看try中的程式碼中throw的是哪個類型的Exception,然後才看catch

裡的順序。

 2.57行的捕獲的是特定的類型HeavyParcelException不能寫錯,或寫Exception

都會有問題。可以自己試試看。

  1)例如位址不為空,57行寫成了HeavyParcelException111

,就會,在60行它的父類別物件中捕獲到,重量錯誤。這不是我們想要的。

      2)例如位址為空,57行寫成了Exception,會拋出位址錯誤,但捕捉的卻是原本負責重量的catch

。這也不是我們想要的。

相關推薦:

PHP異常處理器的自訂

#PHP如何實作映像辨識

php如何實作進程鎖與多進程

###

以上是php捕捉特定類型的異常詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn