PHPで特定の種類の例外をキャッチする方法の詳細な説明

*文
リリース: 2023-03-18 22:26:01
オリジナル
1618 人が閲覧しました

例外キャプチャは、ショートカット キーを使用して現在の多くの 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 メソッド 間違っているのは、アドレスが空であり、行 57>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 (ExceptionHeavyParcelException の代わりに Exception がスローされることです。 /code> がキャプチャされます) >

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

ヒント:

これが最も重要だと感じますコードの実行順序を理解する領域です。いくつかの段落を書き、修正して実行します。

1. キャプチャの順序は、try のコード内でどのタイプの Exceptionthrow であるかによって異なり、次に を確認します。 catch の順序。 2.57 行目は、特定のタイプの HeavyParcelException をキャプチャします。これを間違って書くことはできません。Exception を記述すると問題が発生します。自分で試してみることもできます。

1) たとえば、アドレスが空ではなく、57 行目が HeavyParcelException111 と記述されている場合、重みエラーは 60 行目の親クラス オブジェクトにキャプチャされます。これは私たちが望んでいることではありません。

2) たとえば、アドレスが空で、57 行目が Exception として記述されている場合、アドレス エラーがスローされますが、キャッチされるのは catch です。もともと体重を担当していた。これは私たちが望んでいることでもありません。 関連する推奨事項:

🎜🎜🎜🎜PHP例外ハンドラーのカスタマイズ🎜🎜🎜🎜🎜🎜PHPが画像認識を実装する方法🎜🎜🎜🎜🎜🎜PHPがプロセスロックとマルチプロセスを実装する方法🎜🎜 🎜

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

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