PHPによる例外のスローと特定のタイプの例外のキャッチの詳細な説明

墨辰丷
リリース: 2023-03-28 16:02:01
オリジナル
2237 人が閲覧しました

例外キャプチャは、ショートカット キーを使用して現在の多くの IDE ツールに簡単に追加でき、ユーザーが理解できないエラーを確認したり、原因不明のクラッシュが発生してユーザー エクスペリエンスが低下することを防ぎます。わかりやすいクラッシュ プロンプトを表示するだけでも、error:xxxx xxxxxxxxx を直接表示するよりもはるかに優れています。次の記事では、PHP がどのように例外をスローし、特定の種類の例外をキャッチするかを詳しく紹介します。

異常とは何ですか?

PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。

例外処理は、指定されたエラー (例外) 状況が発生したときに、スクリプトの通常のフローを変更するために使用されます。この状況を例外と呼びます。

例外がトリガーされると、通常は次のことが起こります:

現在のコードの状態が保存されます

コードの実行が事前定義された例外ハンドラー関数に切り替わります

状況に応じて、ハンドラーはコードの実行を再開する、スクリプトの実行を終了する、またはコード内の別の場所からスクリプトの実行を続行する

さまざまなエラー処理方法を示します:

例外の基本的な使用方法

カスタム例外ハンドラーを作成する

複数の例外

例外を再スローする

トップレベルの例外ハンドラーを設定する

PHP が例外をスローし、特定の種類の例外をキャッチする最終的な目標は、コードを実行し続けることができるように、対応するソリューションを提供することです。

この記事のテスト環境: PH​​P5.5.36 Safari 9.1.2


  <?php
  header("content-type:text/html; charset=utf-8");
  /**
  * 包裹重量异常
  */
  class HeavyParcelException extends Exception {}
  
  /**
  * 包裹类
 */
 class Parcel {
 
   /**
   * 包裹寄送目的地地址
   */
   public $address;
 
   /**
   * 包裹重量
   */
   public $weight;
 }
 
 /**
 * 派送员
 */
 class Courier {
  
   /** 
   * 运送
   */
   public function ship(Parcel $parcel) {
     //check we have an address
     //如果包裹的目的地为空
     if(empty($parcel->address)) {
       throw new Exception(&#39;address not Specified(未填写地址)!&#39;);
     } 
 
     //check the weight
     //如果重量超过5
     if($parcel->weight > 5) {
            throw new HeavyParcelException(&#39;Parcel exceeds courier limit(包裹超过运送上限)!&#39;);
     } 
 
     //otherwise we&#39;re coll
     return true;
   }
 }
 
 $myCourier = new Courier();
 $parcel = new Parcel();
 //add the address if we have it 为了测试这里不填写地址
 $parcel->weight = 7;
 try {
   $myCourier->ship($parcel);
   echo "parcel shipped";
 } catch (HeavyParcelException $e) {//捕获HeavyParcelException 不写这个异常的类型名字,就跑到普通Exception抛出去了
   echo "Parcel weight error(重量错误): " . $e->getMessage();
   //redirect them to choose another courier
 } catch (Exception $e) {
   echo "Someting went wrong(地址错误): " . $e->getMessage();
   //exit so we don&#39;t try to proceed any further
   exit;
 }
 echo &#39;<br/>&#39;;
 $a = 123;
 echo $a;
ログイン後にコピー


54行目からのコード実行シーケンス:

55 >

32>

35 (ship メソッドで最初に確認することは、住所が空であることです。57 行目の HeavyParcelException の代わりに、ここで Exception がスローされます) >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

60 (Exception) >

616263 出力アドレスエラー exit 行 65 ~ 67 は出力されません


ヒント:

これに関して最も重要なことは、コードが実行される順序を理解することです。いくつかの段落を書き、修正して実行します。

1. キャプチャの順序は、try のコード内でどのタイプの Exceptionthrow であるかによって異なり、次に を確認します。 catch の順序。

2.57 行目は、特定のタイプの HeavyParcelException をキャプチャします。これを間違って書くことはできません。Exception を記述すると問題が発生します。自分で試してみることもできます。
1) たとえば、アドレスが空ではなく、57 行目が HeavyParcelException111 と記述されている場合、重みエラーは 60 行目の親クラス オブジェクトにキャプチャされます。これは私たちが望んでいることではありません。

2) たとえば、アドレスが空で、57 行目が Exception として記述されている場合、アドレス エラーがスローされますが、キャッチされるのは catch です。もともと体重を担当していた。これは私たちが望んでいることでもありません。 以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。

関連する推奨事項:

PHPでhostsファイルを変更する方法の詳細な説明

🎜🎜スクリプトの非同期実行を実装するPHPメソッド🎜🎜🎜🎜🎜🎜php🎜の定義と実装使うRedis キャッシュ クラスの🎜🎜 🎜🎜 🎜🎜🎜🎜🎜🎜

以上がPHPによる例外のスローと特定のタイプの例外のキャッチの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート