PHP初心者のための例外処理
例外は、指定されたエラーが発生したときにスクリプトの通常のフローを変更するために使用されます。
1. 例外とは何ですか?
例外処理は、指定されたエラー (例外) 狀況が発生したときにスクリプトの通常のフローを変更するために使用されます。この狀況を例外と呼びます。
2. 例外がトリガーされると、通常は次のことが起こります:
現(xiàn)在のコードの狀態(tài)が保存されます
コードの実行が事前定義された (カスタム) 例外ハンドラー関數(shù)に切り替わります
狀況に応じて、プロセッサが保存される場合があります。コードの実行を再開する、スクリプトの実行を終了する、またはコード內(nèi)の別の場所からスクリプトの実行を続行する
3. さまざまなエラー処理方法を示します。
例外の基本的な使用方法
カスタム例外ハンドラーの作成
複數(shù)の例外
例外を再スローする
最上位の例外ハンドラーを設(shè)定する
☆ 注: 例外はエラー狀況でのみ使用する必要があり、指定されたポイントでコードの別の部分にジャンプするために使用しないでください 位置指定
Exception の基本的な使用法:
例外がスローされると、次のコードは実行を続行できず、PHP は一致する「キャッチ」コード ブロックを見つけようとします。
例外がキャッチされず、対応する処理に set_Exception_handler() を使用する必要がない場合、重大なエラー (致命的エラー) が発生し、「Uncaught Exception」エラーメッセージが出力されます。
例外をキャッチせずにスローしてみましょう
<?php
// 例外処理を含む関數(shù)を作成します
function checkNum($number){
, Exception(「値は 1 以下である必要があります」);
}
return true;
}
// 例外をトリガーします
checkNum(2);
?>
致命的なエラー: キャッチされない例外 '例外' とメッセージ '値は 1 でなければなりませんD:WWWphp10.php:5 のスタック トレース: #0 D:WWWphp10.php(11): checkNum(2) #1 {main} が D:WWWphp10.php の 5 行目でスローされました
お試しください、スローしてキャッチ
上記の例で発生したエラーを回避するには、例外を処理する適切なコードを作成する必要があります。 適切な例外処理コードには以下を含める必要があります: Try - 例外を使用する関數(shù)は「try」コード ブロック內(nèi)に配置する必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。 Throw - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。Catch - 「catch」コード ブロックは例外をキャッチし、例外情報(bào)を含むオブジェクトを作成します。
例外をトリガーしましょう
<?php header("Content-type: text/html; charset=utf-8");//設(shè)置編碼 // 創(chuàng)建一個(gè)有異常處理的函數(shù) function checkNum($number){ if($number>1){ throw new Exception("變量值必須小于等于 1"); } return true; } // 在 try 塊 觸發(fā)異常 try{ checkNum(2); // 如果拋出異常,以下文本不會輸出 echo '如果輸出該內(nèi)容,說明 $number 變量'; } // 捕獲異常 catch(Exception $e){ echo 'Message: ' .$e->getMessage(); } ?>
上記のコードは次のようなエラーを受け取ります:
メッセージ: 変數(shù)値は 1 以下である必要があります
例の説明:
上記のコードは例外をスローし、それをキャッチしました:
checkNum() 関數(shù)を作成します。數(shù)値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。
「try」コードブロックでcheckNum()関數(shù)を呼び出します。
checkNum()関數(shù)で例外がスローされます。
「catch」コード ブロックは例外を受け取り、例外情報(bào)を含むオブジェクト ($e) を作成します。
この例外オブジェクトから $e->getMessage() を呼び出して、この例外からのエラー メッセージを出力します。
ただし、「各スローはキャッチに対応する必要がある」という原則に従うために、見逃したエラーを処理するトップレベルの例外ハンドラーをセットアップできます。
カスタム例外クラスを作成する
カスタム例外ハンドラーの作成は非常に簡単です。 PHP で例外が発生したときに関數(shù)を呼び出すことができる特殊なクラスを作成しただけです。このクラスは例外クラスの拡張である必要があります。
このカスタム例外クラスは、PHP の例外クラスのすべてのプロパティを継承しており、カスタム関數(shù)を追加できます。
例外クラスを作成することから始めます:
<?php class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = '錯誤行號 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一個(gè)合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@example...com"; try { // 檢測郵箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是個(gè)不合法的郵箱地址,拋出異常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
この新しいクラスは、古い例外クラスのコピーに errorMessage() 関數(shù)を加えたものです。古いクラスのコピーであるため、古いクラスからプロパティとメソッドが継承され、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できます。
例の説明:
上記のコードは例外をスローし、カスタム例外クラスを通じてそれをキャッチします:
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
errorMessage()関數(shù)を作成します。電子メール アドレスが無効な場合、この関數(shù)はエラー メッセージを返します。
$email 変數(shù)を不正な電子メール アドレス文字列に設(shè)定します。
「try」コードブロックを?qū)g行すると、電子メールアドレスが無効であるため例外がスローされます。
「catch」コード ブロックは例外をキャッチし、エラー メッセージを表示します。
複數(shù)の例外
スクリプトに複數(shù)の例外を使用して、複數(shù)の狀況を検出できます。
複數(shù)の if..else コード ブロックまたは switch コード ブロックを使用したり、複數(shù)の例外をネストしたりできます。これらの例外は、異なる例外クラスを使用し、異なるエラー メッセージを返す可能性があります:
<?php class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = '錯誤行號 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一個(gè)合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@example.com"; try { // 檢測郵箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是個(gè)不合法的郵箱地址,拋出異常 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(); } ?>
例の説明:
上記のコードは 2 つの條件をテストし、いずれかの條件が true でない場合は、例外がスローされます:
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
errorMessage()関數(shù)を作成します。電子メール アドレスが無効な場合、この関數(shù)はエラー メッセージを返します。
$email 変數(shù)を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設(shè)定します。
「try」コード ブロックを?qū)g行すると、最初の條件では例外はスローされません。
メールには文字列「example」が含まれているため、2 番目の條件により例外がトリガーされます。
「catch」コード ブロックは例外をキャッチし、適切なエラー メッセージを表示します。
customException クラスが例外をスローしたが、customException がキャッチされず、基本例外のみがキャッチされた場合、例外はそこで処理されます。
例外を再スロー
例外がスローされたときに、標(biāo)準(zhǔn)の方法とは異なる方法で例外を処理したい場合があります。例外は「catch」ブロックで再度スローできます。
スクリプトはシステムエラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーにとって簡単にするために、わかりやすいメッセージを使用して例外を再度スローできます:
<?php class customException extends Exception { public function errorMessage() { // 錯誤信息 $errorMsg = $this->getMessage().' 不是一個(gè)合法的 E-Mail 地址。'; return $errorMsg; } } $email = "someone@example.com"; try { try { // 檢測 "example" 是否在郵箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是個(gè)不合法的郵箱地址,拋出異常 throw new Exception($email); } } catch(Exception $e) { // 重新拋出異常 throw new customException($email); } } catch (customException $e) { // 顯示自定義信息 echo $e->errorMessage(); } ?>
説明例:
上記のコードは、電子メール アドレスに文字列 "example" が含まれているかどうかを検出します。その場合は、例外を再度スローします。
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。
errorMessage()関數(shù)を作成します。電子メール アドレスが無効な場合、この関數(shù)はエラー メッセージを返します。
$email 変數(shù)を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設(shè)定します。
「try」ブロックには、例外を再度スローできるように別の「try」ブロックが含まれています。
メールに「example」という文字列が含まれているため、例外がトリガーされます。
「catch」コードブロックは例外をキャッチし、「customException」を再スローします。
「customException」をキャッチし、エラーメッセージを表示します。
現(xiàn)在の「try」ブロックで例外がキャッチされない場合は、より高いレベルの catch ブロックを探します。
例外ルール
例外処理を必要とするコードは、潛在的な例外をキャッチするために try コード ブロック內(nèi)に配置する必要があります。
すべての try または throw ブロックには、対応する catch ブロックが少なくとも 1 つ必要です。
複數(shù)の catch ブロックを使用して、さまざまな種類の例外をキャッチします。
例外は、try ブロック內(nèi)の catch ブロックでスロー (再度スロー) できます。
要するに: 例外がスローされた場合は、それをキャッチする必要があります。