例外は、指定されたエラーが発生した場合、スクリプトの通常の流れを変更するために使用されています。
例外とは何ですか
PHP 5ではエラーに対処するための新しいオブジェクト指向の方法を来ました。
例外処理は、指定されたエラーがあれば、コード実行の通常の流れを変更するために使用されている(exceptional)条件が発生しました。 この状態は例外と呼ばれています。
これは、例外がトリガされたとき、通常は何が起こるかです:
- 現在のコードの状態が保存されます
- コードの実行は、定義済みに切り替わります(custom)例外ハンドラ関数
- 状況に応じて、ハンドラは、コード内の別の場所から、保存されたコードの状態から実行を再開スクリプトの実行を終了するか、スクリプトを継続すること
我々は、さまざまなエラー処理方法が表示されます:
- 例外の基本的な使用
- カスタム例外ハンドラを作成します
- 複数の例外
- 再投げる例外を
- トップレベルの例外ハンドラを設定します
Note:例外は、唯一のエラー条件で使用されなければならない、と指定された時点で、コード内の別の場所にジャンプするために使用すべきではありません。
例外の基本的な使用
例外がスローされた場合は、それ以下のコードは実行されません、とPHPはマッチング見つけようとします"catch"ブロックを。
例外がキャッチされていない場合は、致命的なエラーがで発行されます"Uncaught Exception"のメッセージ。
それをキャッチすることなく、例外をスローしてみましょう:
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
上記のコードは、このようなエラーが発生します。
Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
試してみてください、投げるとキャッチ
上記の例からのエラーを回避するために、我々は、例外を処理するための適切なコードを作成する必要があります。
適切な例外コードを含める必要があります。
- 試してみてください-関数であるべき例外を使用して"try"ブロック。 例外がトリガされない場合は、コードは通常どおり続行されます。 例外がトリガされた場合ただし、例外がされた"thrown"
- スロー - これは例外をトリガする方法です。 それぞれの"throw"少なくとも一つ持っている必要があります"catch"
- キャッチ- "catch"ブロックは例外を取得し、例外情報を含むオブジェクトを作成します
有効なコードで例外をトリガしてみましょう:
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
上記のコードは、このようなエラーが発生します。
Message: Value must be 1 or below
例を説明します:
上記のコードは、例外をスローし、それをキャッチ:
- checkNum()関数が作成されます。 もしそうであれば数が1以上である場合には、例外がスローされ、チェック
- checkNum()関数がで呼び出され"try"ブロック
- 内の例外checkNum()関数がスローされます
- "catch"ブロックは、例外を取得し、オブジェクト作成($e)例外情報を含みます
- 例外からのエラー・メッセージが呼び出しによってエコーされ$e-> getMessage()例外オブジェクトから
しかし、一つの方法は、周りを取得するには"every throw must have a catch"のルールはすり抜けエラーを処理するトップレベルの例外ハンドラを設定することです。
カスタム例外クラスの作成
カスタム例外ハンドラを作成するには、例外がPHPで発生したときに呼び出すことができる機能を持つ特別なクラスを作成する必要があります。 クラスは、例外クラスの拡張でなければなりません。
カスタム例外クラスには、PHPの例外クラスからプロパティを継承し、あなたはそれにカスタム機能を追加することができます。
例外クラスを作成することができます:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
新しいクラスが追加で古い例外クラスのコピーであるerrorMessage()関数。 それは昔のクラスのコピーであり、そしてそれは昔のクラスからプロパティとメソッドを継承しているので、私たちのような例外クラスのメソッドを使用することができますgetLine()とgetFile()とgetMessage() 。
例を説明します:
上記のコードは、例外をスローし、カスタム例外クラスでそれをキャッチ:
- customException()クラスは、古い例外クラスの拡張として作成されます。 この方法は、それは古い例外クラスからすべてのメソッドとプロパティを継承します
- errorMessage()関数が作成されます。 電子メールアドレスが無効である場合、この関数は、エラーメッセージを返します。
- $メール変数は有効なメールアドレスではない文字列に設定されています
- "try"ブロックが実行され、電子メールアドレスが無効であるため、例外がスローされます
- "catch"ブロックは、例外をキャッチし、エラーメッセージを表示します
複数の例外
このスクリプトは、複数の条件をチェックするために複数の例外を使用することが可能です。
いくつかのif..elseブロック、スイッチ、または巣複数の例外を使用することが可能です。 これらの例外は別の例外クラスを使用して、さまざまなエラーメッセージを返すことができます。
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e) {
echo $e->errorMessage();
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
例を説明します:
コードは、上記の二つの条件をテストし、条件のいずれかが満たされない場合に例外をスローします。
- customException()クラスは、古い例外クラスの拡張として作成されます。 この方法は、それは古い例外クラスからすべてのメソッドとプロパティを継承します
- errorMessage()関数が作成されます。 電子メールアドレスが無効である場合、この関数は、エラーメッセージを返します。
- $メール変数は、有効な電子メールアドレスである文字列に設定されますが、文字列が含まれている"example"
- "try"ブロックが実行され、例外が最初の条件でスローされません
- 電子メールは、文字列含まれているため、第2の条件は、例外をトリガー"example"
- "catch"ブロックは、例外をキャッチし、正しいエラーメッセージを表示します
スローされた例外クラスcustomExceptionのものであり、一切customExceptionキャッチ、唯一のベース例外のキャッチがなかった場合は、例外が処理されます。
再投げる例外
例外がスローされたときに時々、あなたは、標準的な方法とは異なるそれを処理することを望むかもしれません。 内の例外をもう一度投げることが可能である"catch"ブロック。
このスクリプトは、ユーザーからシステムエラーを非表示にします。 システムエラーは、コーダのために重要であるが、ユーザーへの無関心があることがあります。 ユーザーのために物事を簡単にするためには、あなたは、ユーザーフレンドリーなメッセージと例外を再スローすることができます:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "[email protected]";
try {
try {
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e) {
//re-throw exception
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
例を説明します:
テスト上記のコードは、電子メール・アドレスは、文字列が含まれている場合"example"それがない場合は、例外が再スローされ、その中には:
- customException()クラスは、古い例外クラスの拡張として作成されます。 この方法は、それは古い例外クラスからすべてのメソッドとプロパティを継承します
- errorMessage()関数が作成されます。 電子メールアドレスが無効である場合、この関数は、エラーメッセージを返します。
- $メール変数は、有効な電子メールアドレスである文字列に設定されますが、文字列が含まれている"example"
- "try"ブロックは、他の含まれている"try"ことが可能に例外を再スローするようにするためにブロックを
- 電子メールは、文字列含まれているため、例外がトリガされた"example"
- "catch"ブロックは、例外をキャッチし、再スロー"customException"
- "customException"キャッチされ、エラー・メッセージが表示されます
例外は、現在の中に巻き込まれていない場合は"try"ブロック、それは上のcatchブロックを検索する"higher levels" 。
トップレベルの例外ハンドラを設定します。
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
上記のコードでは全くありませんでした"catch"ブロック。 代わりに、トップレベルの例外ハンドラがトリガさ。 この関数は、キャッチされない例外をキャッチするために使用されるべきです。
例外のルール
- コードは、潜在的な例外をキャッチ助けるために、tryブロックで囲まれていてもよいです
- それぞれのブロックまたは試す"throw"少なくとも一つの対応するcatchブロックを持っている必要があります
- 複数のcatchブロックは、例外の異なるクラスをキャッチするために使用することができます
- 例外がスローされる可能性(or re-thrown) tryブロック内のcatchブロックで
単純なルール:あなたが何かを投げる場合、あなたはそれをキャッチする必要があります。