ホームページ >バックエンド開発 >PHPチュートリアル >PHPによる例外のスローと特定のタイプの例外のキャッチの詳細な説明
例外キャプチャは、ショートカット キーを使用して現在の多くの IDE ツールに簡単に追加でき、ユーザーが理解できないエラーを確認したり、原因不明のクラッシュが発生してユーザー エクスペリエンスが低下することを防ぎます。わかりやすいクラッシュ プロンプトを表示するだけでも、error:xxxx xxxxxxxxx を直接表示するよりもはるかに優れています。次の記事では、PHP がどのように例外をスローし、特定の種類の例外をキャッチするかを詳しく紹介します。
異常とは何ですか?
PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。
例外処理は、指定されたエラー (例外) 状況が発生したときに、スクリプトの通常のフローを変更するために使用されます。この状況を例外と呼びます。
例外がトリガーされると、通常は次のことが起こります:
現在のコードの状態が保存されます
コードの実行が事前定義された例外ハンドラー関数に切り替わります
状況に応じて、ハンドラーはコードの実行を再開する、スクリプトの実行を終了する、またはコード内の別の場所からスクリプトの実行を続行する
さまざまなエラー処理方法を示します:
例外の基本的な使用方法
カスタム例外ハンドラーを作成する
複数の例外
例外を再スローする
トップレベルの例外ハンドラーを設定する
PHP が例外をスローし、特定の種類の例外をキャッチする最終的な目標は、コードを実行し続けることができるように、対応するソリューションを提供することです。
この記事のテスト環境: PHP5.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('address not Specified(未填写地址)!'); } //check the weight //如果重量超过5 if($parcel->weight > 5) { throw new HeavyParcelException('Parcel exceeds courier limit(包裹超过运送上限)!'); } //otherwise we'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't try to proceed any further exit; } echo '<br/>'; $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
Exception
) >616263 出力アドレスエラー exit
行 65 ~ 67 は出力されませんヒント:
これに関して最も重要なことは、コードが実行される順序を理解することです。いくつかの段落を書き、修正して実行します。
try
のコード内でどのタイプの Exception
が throw
であるかによって異なり、次に を確認します。 catch
の順序。 2.57 行目は、特定のタイプの HeavyParcelException
をキャプチャします。これを間違って書くことはできません。Exception
を記述すると問題が発生します。自分で試してみることもできます。
1) たとえば、アドレスが空ではなく、57 行目が HeavyParcelException111
と記述されている場合、重みエラーは 60 行目の親クラス オブジェクトにキャプチャされます。これは私たちが望んでいることではありません。
2) たとえば、アドレスが空で、57 行目が Exception
として記述されている場合、アドレス エラーがスローされますが、キャッチされるのは catch
です。もともと体重を担当していた。これは私たちが望んでいることでもありません。 以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。
関連する推奨事項:
PHPでhostsファイルを変更する方法の詳細な説明
🎜🎜スクリプトの非同期実行を実装するPHPメソッド🎜🎜🎜🎜🎜🎜php🎜の定義と実装使うRedis キャッシュ クラスの🎜🎜 🎜🎜 🎜🎜🎜🎜🎜🎜以上がPHPによる例外のスローと特定のタイプの例外のキャッチの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。