PHPの例外処理
通常のフローを指定したときにスクリプトエラーを変更するための例外が発生します。
何の異常です
PHP 5は、エラー処理、オブジェクト指向のための新しい方法を提供しています。
例外処理は、指定されたエラー(例外)スクリプトの正常な流れを変更するために発生した場合に使用されます。 この状態は例外と呼ばれています。
例外がトリガされると、通常は発生します。
- 現在のコードの状態が保存されます
- コードの実行は、事前定義された(カスタム)の例外ハンドラ関数に切り替えられます
- いくつかのケースでは、プロセッサは、状態コードに格納されたコードから再開することができる、スクリプトの実行を終了するか、別の場所のコードからスクリプトを続行
我々は、さまざまなエラー処理方法が表示されます:
- 基本的な使用の例外
- カスタム例外ハンドラを作成します
- 複数の例外
- 再スロー
- トップレベルの例外ハンドラセット
注:例外エラーの場合のみに使用する必要があり、コード内の別の場所にジャンプすることが指定された点では使用しないでください。
基本的な使用の例外
例外がスローされると、後続のコードが進まない、PHPはマッチング「キャッチ」ブロックを見つけようとします。
例外はではなく、任意の対応する治療のためのset_exception_handlerの使用()でキャッチされていない場合は、重大なエラー(致命的エラー)が発生し、出力「キャッチされない例外」(キャッチされない例外)エラーメッセージ。
のが例外をスローしてみましょうが、それをキャッチしていません:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
上記のコードは次のようにエラーが発生します。
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
試してみてください、投げるとキャッチ
上記の例に現れるエラーを回避するために、我々は、例外を処理するための適切なコードを作成する必要があります。
適切な取り扱い例外コードが含まれている必要があります
- 試してみてください - "しよう"ブロック内に配置する必要があります異常な機能を使用して。 例外がトリガされていない場合、コードは通常どおり続行されます。 例外がトリガされた場合しかし、それは例外がスローされます。
- 投げ - 例外規定をトリガーする方法で。 各「スロー」は、少なくとも1つの「キャッチ」に対応している必要があります。
- キャッチ - 「キャッチ」ブロックは、例外をキャッチし、例外メッセージを含むオブジェクトを作成します。
例外をトリガしてみましょう:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
上記のコードは、このようなエラーが発生します。
Message: 变量值必须小于等于 1
例としては、説明します。
上記のコードは、例外をスローし、それをキャッチ:
- CHECKNUM()関数を作成します。 これは、数が1より大きいか否かを検出します。 それがある場合は、例外がスローされます。
- 「試して」ブロックにCHECKNUM()関数を呼び出します。
- CHECKNUM()関数の例外がスローされます。
- 「キャッチ」ブロックは例外を受け取り、例外($電子)に関する情報を含むオブジェクトを作成します。
- この例外オブジェクト>のgetMessage()、例外のエラーメッセージ出力から$電子を呼び出すことで。
しかし、原則として「キャッチに対応しなければならないすべてのスローを「追跡するために、あなたは逃したエラーを処理するために、トップレベルの例外ハンドラを設定することができます。
カスタム例外クラスを作成します。
カスタム例外ハンドラを作成することは非常に簡単です。 私たちは、単にあなたがその機能を呼び出すことができ、例外はPHPで発生した場合、特別なクラスを作成します。 クラスは、例外クラスの拡張である必要があります。
カスタム例外クラスは、PHPの例外クラスで定義されたすべての属性を継承し、カスタム機能を追加することができます。
例外クラスを作成することで起動します。
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
この新しいクラスは、古い例外クラスのコピー、プラスにErrorMessage()関数です。 それは古いクラスのプロパティとメソッドを継承するので、それは、古いクラスのコピーであるため、我々はそのようなのgetline()、はgetFile()とのgetMessage()などの例外クラスのメソッドを使用することができます。
例としては、説明します。
上記のコードは、例外をスローし、カスタム例外クラスを介して、それをキャプチャします:
- 作成するために、古い例外クラスの拡張としてcustomException()クラス。 それは古い例外クラスのすべての属性とメソッドを継承するように。
- ErrorMessage()関数を作成します。 電子メールアドレスが無効である場合、関数はエラーメッセージを返します。
- $メール変数が無効な電子メールアドレスの文字列に設定されています。
- 電子メールアドレスが有効でないため、例外をスローするので、ブロックを「試して」の実装。
- 「キャッチ」ブロックが例外をキャッチし、エラーメッセージを表示します。
複数の例外
あなたは、さまざまな状況を検出するためのスクリプトとして複数の例外を使用することができます。
あなたは、複数のif..elseブロック、またはコードスイッチのブロック、または巣複数の例外を使用することができます。 これらの例外は別の例外クラスを使用して、別のエラーメッセージを返すことができます。
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 邮箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
例としては、説明します。
上記のコードは、任意の1つの条件が満たされない場合は、例外をスローし、二つの条件をテストします。
- 作成するために、古い例外クラスの拡張としてcustomException()クラス。 それは古い例外クラスのすべての属性とメソッドを継承するように。
- ErrorMessage()関数を作成します。 電子メールアドレスが無効である場合、関数はエラーメッセージを返します。
- $メール変数は、有効な電子メールアドレスですが、文字列 "例"を含む文字列に設定されています。
- 最初の条件のコードのブロックを "試して"の実装は、例外はスローされません。
- 電子メールは文字列 "例"を含んでいるので、第2の条件は、例外をトリガします。
- 「キャッチ」ブロックは、例外をキャッチし、適切なエラーメッセージが表示されます。
customExceptionクラスの例外がスローさだけベースの例外は、ハンドルの例外を捕捉し、customExceptionをキャッチされていない場合。
再スロー
例外がスローされたときに時々、あなたはそれを処理する標準的な方法とは異なるしたい場合があります。 再び「キャッチ」ブロックでスローされることがあります。
スクリプトは、ユーザーのシステム・エラーから隠されるべきです。 プログラマのため、システムエラーが重要かもしれませんが、ユーザーはそれらに興味を持っていないです。 それが簡単に、ユーザーが使用できるようにするためには、比較的ユーザーフレンドリーなメッセージで再び例外をスローすることができます。
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "[email protected]"; try { try { // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new Exception($email); } } catch(Exception $e) { // 重新抛出异常 throw new customException($email); } } catch (customException $e) { // 显示自定义信息 echo $e->errorMessage(); } ?>
例としては、説明します。
それが文字列 "例"が含まれている場合、上記のコードは、電子メールアドレスで検出されました。 ある場合は、もう一度、例外がスローされます。
- 作成するために、古い例外クラスの拡張としてcustomException()クラス。 それは古い例外クラスのすべての属性とメソッドを継承するように。
- ErrorMessage()関数を作成します。 電子メールアドレスが無効である場合、関数はエラーメッセージを返します。
- $メール変数は、有効な電子メールアドレスですが、文字列 "例"を含む文字列に設定されています。
- ブロックはあなたが再び例外を投げることができるので、他の、コードのブロックを "試して"が含まれている "してみてください」。
- 電子メールは文字列 "例"を含んでいるので、そのための例外をトリガします。
- 「キャッチ」ブロックは例外と再スロー」customException "をキャッチします。
- 「customException」を捕捉し、エラーメッセージが表示されます。
例外は、現在の "しよう"ブロックでキャッチされていない場合は、上位レベルのcatchブロックを探します。
トップレベルの例外ハンドラセット
set_exception_handler()関数は、ユーザー定義関数のすべてのキャッチされない例外を処理するように設定することができます。
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
次のように上記のコードの出力は、次のとおりです。
Exception: Uncaught Exception occurred
上記のコードでは、そこには「キャッチ」ブロックではありませんが、トップレベルの例外ハンドラがトリガさ。 この機能は、すべてのキャッチされない例外を捕捉するために使用されるべきです。
例外規則
- 例外処理コードは、潜在的な例外をキャッチするために、tryブロックに配置する必要があります。
- 各投げたりしてみてくださいコードブロックは、少なくとも一つの対応するcatchブロックを持っている必要があります。
- あなたは、例外の種類をキャッチするために複数のcatchブロックを使用することができます。
- tryコードブロックは、catchブロック(再びスローされた)例外をスロー内であってもよいです。
要するに:あなたは例外をスローした場合、あなたはそれをキャッチしなければなりません。