PHP例外処理関連の知識

WBOY
WBOYオリジナル
2016-07-25 09:00:56912ブラウズ
  1. //例外を含む関数を作成
  2. function checkNum($number)
  3. {
  4. if($number>1)
  5. {
  6. throw new Exception("値は 1 以下である必要があります") ;
  7. }
  8. return true;
  9. //トリガー例外
  10. ?>
上記のコードは次のようなエラーを受け取ります。 致命的なエラー: キャッチされない例外「例外」 C:webfoldertest.php:6 に「値は 1 以下である必要があります」というメッセージが含まれる スタック トレース: #0 C:webfoldertest.php(12): checkNum(28) #1 {main} が C:webfoldertest.php の 6 行目でスローされました 試して、投げて、捕まえて 上記の例のエラーを回避するには、例外を処理する適切なコードを作成する必要があります。 処理手順には以下を含める必要があります。 Try - 例外を使用する関数は、「try」ブロック内に置く必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。 Throw - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。 Catch - 「catch」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します

例外をトリガーしてみましょう:

//例外をスローできる関数を作成します
    function checkNum($number)
  1. {
  2. if($number>1)
  3. {
  4. throw new Exception("値は 1 である必要があります)以下");
  5. }
  6. return true;
  7. }
  8. //「try」コードブロックで例外をトリガーする
  9. try
  10. {
  11. checkNum(2);
  12. // 例外がスローされた場合、このテキストは表示されません
  13. echo 'これが表示された場合、番号は 1 以下です';
  14. }
  15. //例外をキャッチ
  16. catch(Exception $e)
  17. {
  18. echo 'Message: ' .$e->getMessage(); }
  19. ?>
  20. コードをコピーします
  21. 上記のコードでは、次のようなエラーが発生します。 メッセージ: 値は 1 以下である必要があります 説明例: 上記のコードは例外をスローし、それをキャッチします。 checkNum()関数を作成します。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。 「try」ブロックで checkNum() 関数を呼び出します。 checkNum() 関数で例外がスローされる 「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。 この例外オブジェクトから $e->getMessage() を呼び出して、この例外からのエラー メッセージを出力します
ただし、「各スローはキャッチに対応する必要がある」という原則に従うために、見逃したエラーを処理する最上位の例外ハンドラーをセットアップできます。 カスタム例外クラスを作成する カスタム例外ハンドラーの作成は非常に簡単です。 PHP で例外が発生したときに関数が呼び出される特殊なクラスを作成しただけです。このクラスは例外クラスの拡張である必要があります。 このカスタム例外クラスは、PHP の例外クラスのすべてのプロパティを継承しており、カスタム関数を追加できます。

例外クラスの作成を開始します。

classcustomException extends Exception
{
    public function errorMessage()
  1. {
  2. //エラーメッセージ
  3. $errorMsg = '行 '.$this->getLine() でエラーが発生しました。' '.$this->getFile()
  4. .': '.$this->getMessage().' は有効な電子メール アドレスではありません
  5. return $errorMsg ;
  6. }
  7. }
  8. $email = "someone@example...com";
  9. 試してみる
  10. {
  11. //
  12. if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  13. {
  14. //電子メールが無効な場合は例外をスローします
  15. throw newcustomException($email)
  16. }
  17. }
  18. catch (customException $e)
  19. {
  20. //カスタムメッセージを表示します
  21. echo $e->errorMessage(); ?>
  22. コードをコピー
  23. この新しいクラスは、古い例外クラスのコピーに errorMessage() 関数を加えたものです。 古いクラスのコピーであるため、古いクラスからプロパティとメソッドが継承され、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できます。 説明例: 上記のコードは例外をスローし、カスタム例外クラスを通じてそれをキャッチします。 CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古いクラスのすべてのプロパティとメソッドを継承します。 errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。 $email 変数に不正な電子メール アドレス文字列を設定する 電子メール アドレスが無効であるため、「try」コード ブロックを実行して例外をスローします。 「catch」コード ブロックは例外をキャッチし、エラー メッセージを表示します

    複数の例外

    スクリプトに複数の例外を使用して、複数の状況を検出できます。

    複数の if..else コード ブロックまたは switch コード ブロックを使用したり、複数の例外をネストしたりできます。これらの例外では、異なる例外クラスが使用され、異なるエラー メッセージが返される場合があります。

    1. classcustomException extends Exception
    2. {
    3. public function errorMessage()
    4. {
    5. //エラーメッセージ
    6. $errorMsg = '行 '.$this->getLine() でエラーが発生しました。' '.$this->getFile()
    7. .': '.$this->getMessage().' は有効な電子メール アドレスではありません
    8. return $errorMsg ;
    9. }
    10. }
    11. $email = "someone@example.com";
    12. 試してみる
    13. {
    14. // if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
    15. {
    16. // 例外をスローするメールアドレスが無効な場合
    17. throw newcustomException($email);
    18. }
    19. //メールアドレスに「example」があるかチェック
    20. if(strpos($email, "example") !== FALSE)
    21. {
    22. throw new Exception ("$email は電子メールの例です");
    23. }
    24. }
    25. catch (customException $e)
    26. {
    27. echo $e->errorMessage()
    28. }
    29. catch(Exception $e)
    30. {
    31. echo $e->getMessage();
    32. }
    33. ?>
    コードをコピー
    説明例: 上記のコードは 2 つの条件をテストします。いずれかの条件が true でない場合は、例外がスローされます。 CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古いクラスのすべてのプロパティとメソッドを継承します。 errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。 コードの「try」ブロックを実行すると、最初の条件では例外はスローされません。 電子メールには文字列「example」が含まれているため、2 番目の条件により例外がトリガーされます。 「catch」コード ブロックは例外をキャッチし、適切なエラー メッセージを表示します

    customException がキャッチされず、基本例外がしっかりとキャッチされた場合、例外はそこで処理されます。 例外を再スローします

    例外がスローされたときに、標準の方法とは異なる方法で例外を処理したい場合があります。例外は「catch」ブロックで再度スローできます。

    スクリプトはシステムエラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーが簡単にできるように、わかりやすいメッセージを付けて例外を再度スローできます。

    1. classcustomException extends Exception
    2. {
    3. public function errorMessage()
    4. {
    5. //エラーメッセージ
    6. $errorMsg = $this->getMessage().' は有効な E- ではありませんメールアドレス。';
    7. return $errorMsg; }
    8. }
    9. $email = "someone@example.com";
    10. try
    11. {
    12. //メールアドレスの「example」をチェックする
    13. if( strpos($email, "example") !== FALSE)
    14. {
    15. //電子メールが無効な場合は例外をスローします
    16. throw new Exception($email)
    17. }
    18. }
    19. catch(Exception $e)
    20. {
    21. / /re-throw 例外
    22. throw newcustomException($email);
    23. }
    24. }
    25. catch (customException $e)
    26. {
    27. //カスタムメッセージを表示
    28. echo $e->errorMessage()
    29. }
    30. ?> ;
    31. コードをコピー

    説明例: 上記のコードは、電子メール アドレスに文字列「example」が含まれているかどうかを検出します。その場合は、再度例外をスローします。 CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古いクラスのすべてのプロパティとメソッドを継承します。 errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。 $email 変数を有効な電子メール アドレスに設定しますが、文字列「example」が含まれます。 「try」ブロックには別の「try」ブロックが含まれているため、例外を再度スローできます。 電子メールに文字列「example」が含まれているため、例外がトリガーされます。 「catch」は例外をキャッチし、「customException」を再スローします。 「customException」がキャッチされ、エラー メッセージが表示されます。

    例外が現在の "try" ブロックでキャッチされない場合は、より高いレベルで catch ブロックを探します。

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

    set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます。

    1. function myException($Exception)
    2. {
    3. echo "Exception: " , $Exception->getMessage()
    4. }
    5. set_Exception_handler( 'myException');
    6. throw new Exception('キャッチされない例外が発生しました');
    コードをコピー
    上記のコードの出力は次のようになります。 例外: キャッチされない例外が発生しました 上記のコードには「catch」ブロックはなく、代わりにトップレベルの例外ハンドラーがトリガーされます。この関数は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。 珍しいルール 例外処理を必要とするコードは、潜在的な例外をキャッチするために try ブロック内に配置する必要があります。 すべての try ブロックまたは throw ブロックには、対応する catch ブロックが少なくとも 1 つ必要です。 複数の catch ブロックを使用して、さまざまな種類の例外をキャッチします。 例外は、try ブロック内の catch ブロックで再スローできます。

    つまり、例外がスローされた場合は、それをキャッチする必要があります。

    出典: http://bbs.it-home.org/w3school/php/php_Exception.html

    例:

      function throwTest($data)
    1. {
    2. try
    3. {
    4. if (!is_array($data) || emptyempty($data))
    5. {
    6. throw new Exception('data型は配列ではありません', 445);
    7. }
    8. echo('テスト完了!!')
    9. }
    10. catch (Exception $e)
    11. {
    12. /*echo 'エラーメッセージ:',$e-> getMessage( ), '
      ';//エラーメッセージ
    13. echo '
      エラーコード:', $e->getCode(), '
      ';//エラーコード
    14. echo '
      エラー ファイル:', $e->getFile(), '
      ';//エラー ファイル
    15. echo '
      エラー行番号:', $e-&gt ;getLine (), '
      ';//エラー行番号
    16. echo '
      エラー情報を配列で表示:', print_r($e->getTrace()), '< /pre>' ;//エラー情報は配列として表示されます</li>
      <li> echo '<pre class="brush:php;toolbar:false">エラー情報は文字列として表示されます:', $e->getTraceAsString(), '
      ';//エラー情報は文字列として表示されます* /
    17. echo $e->getMessage(), '
      ';//エラーメッセージ
    18. echo '
      ', $e->getTraceAsString() , '
      ' ;//エラー情報は文字列として表示されます
    19. }
    20. }
    21. //$data=array("111","33333") //通常のテスト
    22. "8129233"; //異常なテスト
    23. throwTest($data)?>
    24. ; 興味があるかもしれない記事:
    25. PHPの例外処理クラスExceptionの使用例
    PHP5の例外処理、エラースロー、コールバック関数など phpの例外処理、エラースロー、エラーコールバック関数

    単純なPHPカスタム例外クラス PHP エラーと例外設定を学ぶ

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。