例外は、指定されたエラーが発生したときにスクリプトの通常のフローを変更するために使用されます。
PHP 5 は、エラー処理に対する新しいオブジェクト指向アプローチを提供します。
例外処理は、指定されたエラー (例外) 条件が発生したときにスクリプトの通常のフローを変更するために使用されます。この状況を例外と呼びます。
例外がトリガーされると、通常は次のことが起こります。
現在のコードの状態が保存されます
コードの実行は、事前定義された (カスタム) 例外ハンドラー関数に切り替えられます。
状況に応じて、プロセッサは保存されたコード状態からコード実行を再開したり、スクリプト実行を終了したり、コード内の別の場所からスクリプト実行を継続したりすることがあります。
さまざまなエラー処理方法を示します。
例外の基本的な使い方
カスタム例外ハンドラーを作成する
複数の例外
例外を再スローする
最上位の例外ハンドラーを設定する
注:例外はエラー状況でのみ使用する必要があり、コード内の指定された位置で別の場所にジャンプするために使用しないでください。
例外がスローされると、次のコードは実行を続行できず、PHP は一致するコードの「キャッチ」ブロックを見つけようとします。
例外がキャッチされず、 set_Exception_handler() を使用して適切に処理されなかった場合、重大なエラー (致命的エラー) が発生し、「Uncaught Exception」エラー メッセージが出力されます。
例外をキャッチせずにスローしてみましょう。
<?php //例外処理を備えた関数を作成します関数checkNum ( $number ) { if ( $number > 1 ) { 投げる新しい例外( 「値は1 以下である必要があります」 ) } 戻る真実; } //例外をトリガーするチェック番号( 2 ) ? >
上記のコードでは、次のようなエラーが発生します。
致命的なエラー: /www/codercto/test/test.php:7 でメッセージ「値は 1 以下である必要があります」を含む例外「例外」がキャッチされませんスタック トレース: #0 /www/codercto/test/test.php(13): checkNum(2) #1 {main} が /www/codercto/test/test.php の 7 行目でスローされました
上の例に見られるエラーを回避するには、例外を処理する適切なコードを作成する必要があります。
適切な例外処理コードには次のものが含まれている必要があります。
Try - 例外を使用する関数は、「try」ブロック内に置く必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。
Throw - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。
Catch - 「catch」ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します。
例外をトリガーしてみましょう。
<?php //例外処理を備えた関数を作成します関数checkNum ( $number ) { if ( $number > 1 ) { 投げる新しいException ( 「変数値は1 以下でなければなりません」 ) } 戻る真実; } // try ブロックで例外をトリガーする試す{ checkNum ( 2 ) ; //例外がスローされた場合、次のテキストは出力されません。 エコー'この内容が出力された場合は、$number 変数について説明します' } //例外をキャッチしますcatch (例外$e ) { エコー'メッセージ: ' . $e - > getMessage ( ) ; ?>
上記のコードでは、次のようなエラーが発生します。
メッセージ: 変数値は 1 以下である必要があります
上記のコードは例外をスローし、それをキャッチします。
checkNum()関数を作成します。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。
「try」ブロックで checkNum() 関数を呼び出します。
checkNum() 関数で例外がスローされます。
「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。
この例外オブジェクトから $e->getMessage() を呼び出して、この例外からのエラー メッセージを出力します。
ただし、「すべてのスローはキャッチに対応する必要がある」という原則に従うために、見逃したエラーを処理する最上位の例外ハンドラーをセットアップできます。
カスタム例外ハンドラーの作成は非常に簡単です。 PHP で例外が発生したときに関数を呼び出すことができる特殊なクラスを作成しただけです。このクラスは例外クラスの拡張である必要があります。
このカスタムのcustomExceptionクラスは、PHPの例外クラスのすべてのプロパティを継承しており、カスタム関数を追加できます。
まず、customException クラスを作成します。
<?phpクラスカスタム例外伸びる例外{ 公共関数エラーメッセージ( ) { //エラーメッセージ $ errorMsg = 'エラー行番号' . $ this - > getFile ( ) ' . $ this - > getMessage ( ) ' </b>有効な電子メール アドレス'を返します。 $エラーメッセージ; } $email = " someone@ example ...com " ; { //メールを検出 if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { //不正なメールアドレスの場合は例外をスローします 投げる新しいカスタム例外( $ email ) ; } キャッチ(カスタム例外$e ) { //カスタムメッセージを表示しますエコー$e - >エラーメッセージ( ) ; ?>
この新しいクラスは、古い例外クラスのコピーに errorMessage() 関数を加えたものです。古いクラスのコピーであるため、古いクラスからプロパティとメソッドを継承し、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できます。
上記のコードは例外をスローし、カスタム例外クラスを通じてそれをキャッチします。
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
$email 変数を不正な電子メール アドレス文字列に設定します。
「try」コード ブロックが実行され、電子メール アドレスが無効であるため例外がスローされます。
「catch」コード ブロックは例外をキャッチし、エラー メッセージを表示します。
スクリプトに複数の例外を使用して、複数の状況を検出できます。
複数の if..else コード ブロックまたは switch コード ブロックを使用したり、複数の例外をネストしたりできます。これらの例外では、異なる例外クラスが使用され、異なるエラー メッセージが返される場合があります。
<?phpクラスカスタム例外伸びる例外{ 公共関数エラーメッセージ( ) { //エラーメッセージ $ errorMsg = 'エラー行番号' . $ this - > getFile ( ) ' . </b>いいえ。有効な電子メール アドレス'を返します。 $エラーメッセージ; } $ email = " [email protected] " ; { //メールを検出 if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { //不正なメールアドレスの場合は例外をスローします 投げる新しいカスタム例外( $ email ) ; //メールアドレスに「example」が含まれているかどうかを確認する if ( strpos ( $email , " example " ) !== FALSE ) { 投げる新しい例外( 「 $email はサンプルのメールボックスです」 ) } }キャッチ(カスタム例外$e ) { エコー$e - >エラーメッセージ( ) ; catch (例外$e ) { エコー$e - > getMessage ( ) ; ?>
上記のコードは 2 つの条件をテストし、どちらかの条件が true でない場合は例外をスローします。
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
$email 変数を、有効な電子メール アドレスであるが文字列「example」を含む文字列に設定します。
コードの「try」ブロックを実行すると、最初の条件では例外はスローされません。
電子メールには文字列「example」が含まれているため、2 番目の条件により例外がトリガーされます。
「catch」ブロックは例外をキャッチし、適切なエラー メッセージを表示します。
CustomException クラスが例外をスローしたが、customException がキャッチされず、基本例外のみがキャッチされた場合、例外はそこで処理されます。
例外がスローされたときに、標準とは異なる方法で例外を処理したい場合があります。例外は「catch」ブロックで再度スローできます。
スクリプトはシステム エラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーが簡単にできるように、わかりやすいメッセージを付けて例外を再度スローできます。
<?phpクラスカスタム例外伸びる例外{ 公共関数エラーメッセージ( ) { //エラーメッセージ $errorMsg = $this -> getMessage ( ) '有効な電子メール アドレスではありません。 ' ;戻る$エラーメッセージ; } $ email = " [email protected] " ; { 試す { //メールアドレスに「example」が含まれているかどうかを確認する if ( strpos ( $email , " example " ) !== FALSE ) { //不正なメールアドレスの場合は例外をスローします 投げる新しい例外( $ email ) ; } catch (例外$e ) { //例外を再スローします 投げる新しいカスタム例外( $ email ) ; }キャッチ(カスタム例外$e ) { //カスタム情報を表示します エコー$e - >エラーメッセージ( ) ; ?>
上記のコードは、電子メール アドレスに文字列「example」が含まれているかどうかを検出します。その場合は、再度例外をスローします。
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
$email 変数を、有効な電子メール アドレスであるが文字列「example」を含む文字列に設定します。
「try」ブロックには別の「try」ブロックが含まれているため、例外を再度スローできます。
電子メールには文字列「example」が含まれているため、例外がトリガーされます。
「catch」コード ブロックは例外をキャッチし、「customException」を再スローします。
「customException」がキャッチされ、エラー メッセージが表示されます。
現在の「try」ブロックで例外がキャッチされない場合は、より高いレベルで catch ブロックを探します。
set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定します。
<?php関数myException ( $Exception ) { エコー" <b>例外:</b> " 、 $ Exception -> getMessage ( ) ; set_Exception_handler ( ' myException ' ) ;新しい例外( 「キャッチされない例外が発生しました」 ) ? >
上記のコードの出力は次のようになります。
例外: キャッチされない例外が発生しました
上記のコードには「catch」ブロックはなく、代わりにトップレベルの例外ハンドラーがトリガーされます。この関数は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。
例外処理を必要とするコードは、潜在的な例外をキャッチするために try ブロック内に配置する必要があります。
各 try ブロックまたは throw ブロックには、対応する catch ブロックが少なくとも 1 つ必要です。
複数の catch ブロックを使用して、さまざまな種類の例外をキャッチします。
例外は、try ブロック内の catch ブロックでスロー (再スロー) できます。
つまり、例外がスローされた場合は、それをキャッチする必要があります。