例外キャプチャは、ショートカット キーを使用して現在の多くの 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('address not Specified(未填写地址)!'); 37 } 38 39 //check the weight 40 //如果重量超过5 41 if($parcel->weight > 5) { 42 throw new HeavyParcelException('Parcel exceeds courier limit(包裹超过运送上限)!'); 43 } 44 45 //otherwise we'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't try to proceed any further 63 exit; 64 } 65 echo '<br/>'; 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
ExceptionHeavyParcelException
の代わりに Exception
がスローされることです。 /code> がキャプチャされます) >616263 出力アドレスエラー exit
行 65 ~ 67 は出力されません
HeavyParcelException111
と記述されている場合、重みエラーは 60 行目の親クラス オブジェクトにキャプチャされます。これは私たちが望んでいることではありません。 🎜🎜🎜🎜PHP例外ハンドラーのカスタマイズ🎜🎜🎜🎜🎜🎜PHPが画像認識を実装する方法🎜🎜🎜🎜🎜🎜PHPがプロセスロックとマルチプロセスを実装する方法🎜🎜 🎜以上がPHPで特定の種類の例外をキャッチする方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。