PHP例外処理
例外とは
PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。
例外処理は、指定されたエラー (例外) 状況が発生したときにスクリプトの通常のフローを変更するために使用されます。この状況を例外と呼びます。
例外がトリガーされると、通常は次のようなことが起こります:
·出てくる
アウト アウト アウト アウト アウト スルー スルー スルー スルー スルー スルー スルー スルー通過する通り、スルースルースルースルースルー - インツーウィットツーベースに移動する場合、保存されたコードステータスが再びコードの実行を開始し、スクリプトの実行を終了するか、または実行し続けます別の位置からスクリプトを実行します
さまざまなエラーを表示します:
· 異常使用の基本的な使用方法
· カスタム異常処理ハンドラーを作成する
·使う 使う 使う 使う 使う 使う アウト アウト アウト アウト スルー アウト スルー オフ オフ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ アウトスルースルーアウトを使用してアウト ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ 処理する
· - try、throw、catch 例外を使用できます。つまり、try を使用して、例外がスローされたかどうかを検出します。例外がスローされた場合は、catch を使用して例外をキャッチします。
try には、対応する catch が少なくとも 1 つ必要です。複数のキャッチを定義して、さまざまなオブジェクトをキャプチャします。 PHP は、最後のキャッチが完了するまで、定義された順序でこれらのキャッチを実行します。これらのキャッチ内で、新しい例外がスローされる可能性があります。
注: 例外はエラー状況でのみ使用する必要があり、コード内の指定された位置で別の場所にジャンプするために使用しないでください。
例外の基本的な使用法例外がスローされると、後続のコードは実行を続行せず、PHP は一致する「キャッチ」コード ブロックを見つけようとします。
例外がキャッチされず、対応する処理に set_Exception_handler() を使用する必要がない場合、重大なエラー (致命的エラー) が発生し、「Uncaught Exception」エラーメッセージが出力されます。
例外をキャッチせずにスローしてみましょう:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
上記のコードは次のようなエラーを受け取ります:
致命的なエラー: キャッチされない例外 '例外' とメッセージ '値は 1 以下である必要があります' in /www/php/ test/test.php:7 スタック トレース: #0 /www/php/test/test.php(13): checkNum(2) #1 {main} が /www/php/test/test.php の 7 行目にスローされました
試して、投げて、キャッチしてください
上記の例のエラーを回避するには、例外を処理する適切なコードを作成する必要があります。
適切な例外処理コードには以下を含める必要があります:
1. Try - 例外を使用する関数は、「try」コード ブロック内に配置する必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。
2. スロー - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。
3. Catch - 「catch」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します。
例外をトリガーしましょう:
<?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(); } ?>
上記のコードは、次のようなエラーを受け取ります:
メッセージ: 変数値は 1 以下である必要があります
例の説明:
上記のコードは、例外を取得してキャッチする :
1. checkNum() 関数を作成します。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。
2. 「try」コードブロックで checkNum() 関数を呼び出します。
3. checkNum() 関数で例外がスローされます。
4. 「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。
5. この例外オブジェクトから $e->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 = "123456789@qq.com"; 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() などの例外クラスのメソッドを使用できます。
例の説明:
上記のコードは例外をスローし、カスタム例外クラスを通じてそれをキャッチします:
1.customException() クラスは、古い例外クラスの拡張として作成されます。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
2. errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
3. $email 変数を不正な電子メール アドレス文字列に設定します。
4. 電子メール アドレスが不正であるため、「try」コード ブロックを実行して例外をスローします。
5. 「catch」コード ブロックは例外をキャッチし、エラー メッセージを表示します。
複数の例外
スクリプトに複数の例外を使用して、複数の状況を検出できます。
複数の if..else コード ブロックまたは switch コード ブロックを使用したり、複数の例外をネストしたりできます。これらの例外は、異なる例外クラスを使用し、異なるエラー メッセージを返す可能性があります。
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "123456789@qq.com "; 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(); } ?>
例の説明:
上記のコードは、いずれかの条件が true でない場合、例外がスローされます。
1. ) クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
2. errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
3. $email 変数を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設定します。
4. 「try」コード ブロックを実行すると、最初の条件では例外はスローされません。
5. 電子メールには「example」という文字列が含まれているため、2 番目の条件によって例外がトリガーされます。
6. 「catch」コード ブロックは例外をキャッチし、適切なエラー メッセージを表示します。
customException クラスが例外をスローしたが、customException がキャッチされず、基本例外のみがキャッチされた場合、例外はそこで処理されます。
例外の再スロー
例外がスローされたときに、標準の方法とは異なる方法で処理したい場合があります。例外は「catch」ブロックで再度スローできます。
スクリプトはシステムエラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーにとって簡単にするために、よりユーザーフレンドリーなメッセージを使用して例外を再度スローできます:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "someone@example.com"; 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(); } ?>
説明:
上記のコードは、文字列「example」が電子メール アドレスに含まれているかどうかを検出します。その場合は、再度例外をスローします:
1.customException() クラスは、古い例外クラスの拡張として作成されます。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
2. errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
3. $email 変数を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設定します。
4. 「try」ブロックには、例外を再度スローできるように別の「try」ブロックが含まれています。
5. メールに「example」という文字列が含まれているため、例外がトリガーされます。
6. 「catch」コードブロックは例外をキャッチし、「customException」を再スローします。
7.「customException」がキャッチされ、エラーメッセージが表示されます。
現在の "try" ブロックで例外がキャッチされない場合は、より高いレベルの catch ブロックを探します。
最上位の例外ハンドラーを設定します
set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます。
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
上記のコードの出力は次のようになります:
例外: キャッチされない例外が発生しました
上記のコードには、「キャッチ」コード ブロックはなく、代わりにトップレベルの例外ハンドラーがトリガーされます。この関数は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。
基本構文:
try{
}catch(){
}
try catch は 1 つの本体です
try catch の間にコードを含めることはできません。
1. try のコードに問題がない場合は、try のコードを実行した後、catch をスキップして続行します。
2. try のコードが異常である場合は、例外オブジェクトをスローします。 catch 内のパラメータがスローされると、try 内のコードは実行されなくなり、catch に直接ジャンプして一度に実行されます。
3. catch はどのような例外が発生したかを尋ねますが、これが重要ではありません。解決できない場合は、渡された例外がユーザーに出力されます。
例外クラス:
組み込み例外クラス (リファレンスマニュアル)
カスタマイズされた例外クラス:
1. 独自の例外クラスを定義します。これは組み込みクラス Exception のサブクラスである必要があります。コンストラクターと tostring () のみがオーバーライドでき、その他はすべて Final キーワードで変更されます。
例:
<?php class openfileException{ function open(){ touch("pb160.txt","r"); $file=fopen("pb160.txt","r"); return $file; } } try{ echo "你好,我是pb!"; $file=@open("pp.txt","r"); if(!$file) throw new openfileException("打开文件失败啦!"); echo "打开文件成功时可以看到我!"; }catch(openfileException $e){ echo $e->getMessage()."<br>"; $file=$e->open(); } echo "再见了啊!"; ?>
独自の例外クラスを作成する目的は、発生した例外を解決するための 1 つ以上のメソッドを作成することです。
· 例外処理を必要とするコードは、潜在的な例外をキャッチするために try コード ブロックに配置する必要があります。
· 各 try または throw コード ブロックには、対応する catch コード ブロックが少なくとも 1 つ必要です。
· 複数の catch コード ブロックを使用して、さまざまな種類の例外をキャッチします。
· try ブロック内の catch ブロックで例外をスロー (再度スロー) できます。
要するに: 例外がスローされた場合は、それをキャッチする必要があります。