まず第一に、PHP 例外とは何なのかを知る必要があります。
例外は、指定されたエラーが発生したときにスクリプトの通常のフローを変更するために使用されます。
PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。
例外処理は、指定されたエラー (例外) 状況が発生したときにスクリプトの通常のフローを変更するために使用されます。この状況を例外と呼びます。
例外がトリガーされると、通常は次のようなことが起こります。
現在のコードの状態が保存されます
コードの実行が事前定義された例外ハンドラー関数に切り替わります
状況に応じて、ハンドラー おそらく、保存されたコード状態からコード実行を再開するか、スクリプト実行を終了するか、コード内の別の場所からスクリプト実行を継続します
さまざまなエラー処理方法を示します:
例外の基本的な使用法
カスタム例外ハンドラーの作成
複数の例外
例外の再スロー
トップレベルの例外ハンドラーの設定
例外の基本的な使用法
例外がスローされると、それに続くコードの実行は続行されず、PHP一致するコードの「キャッチ」ブロックを見つけようとします。
例外がキャッチされず、対応する処理に set_Exception_handler() を使用する必要がない場合は、重大なエラー (致命的エラー) が発生し、「Uncaught Exception」というエラー メッセージが出力されます。
例外をキャッチせずにスローしてみましょう:
コードをコピーします コードは次のとおりです:
//例外を持つ関数を作成function
checkNum($number) {
if($number>1) {
throw new Exception(”値は 1 以下である必要があります " );
} return true;
}
//trigger
?>
コードをコピーします コードは次のとおりです: コードは次のとおりです。 < ?php //error classcustomException extends Exception { public function errorMessage() { //エラーメッセージ //メールアドレスの「example」をチェックする コードをコピー コードは次のとおりです。
classcustomException extends Exception {
public function errorMessage() {
//エラーメッセージ
$errorMsg = '行のエラー '.$this-> ;getLine().' '.$this->getFile() .': '.$this->getMessage().' ; return $errorMsg;
}
}
$email = “someone@example…com”;try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) == = FALSE) {
//電子メールが無効な場合は例外をスローします throw
newcustomException($email)
}
}catch (customException $e)
{
//カスタム メッセージを表示します
echo $e->errorMessage();
}?> この新しいクラスは、古い例外クラスのコピーに errorMessage() 関数を追加したものです。 。古いクラスのコピーであるため、古いクラスからプロパティとメソッドが継承され、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できます。
上記のコードは例外をスローし、カスタム例外クラスを通じてそれをキャッチします:
customException() クラスは古い例外クラスとして使用されます。拡大。このようにして、古いクラスのすべてのプロパティとメソッドを継承します。
errorMessage() 関数を作成します。電子メール アドレスが不正な場合、関数はエラー メッセージを返します
$email 変数に不正な電子メール アドレス文字列を設定します
電子メール アドレスが不正であるため、「try」コード ブロックを実行しますしたがって、例外がスローされます
「キャッチ」コード ブロックは例外をキャッチし、エラー メッセージを表示します
複数の例外
スクリプトで複数の例外を使用して、複数の状況を検出できます。
複数の if..else コード ブロックまたは switch コード ブロックを使用したり、複数の例外をネストしたりできます。これらの例外は、異なる例外クラスを使用し、異なるエラー メッセージを返す可能性があります。
コードをコピー
message$errorMsg = '.$this->getLine() の行でエラーが発生しました。' ->getFile().': '.$this->getMessage().'
return $errorMsg; }
}
$email = "someone@example.com";try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
/ //電子メールが無効な場合は例外をスローします throw new
customException($email)
}
//メールアドレスの「example」をチェックします
if(strpos($email, “example”) !== FALSE) { throw new Exception(“$email は電子メールの例です”) } }catch (customException $e) { echo $e->errorMessage() }catch(Exception $e); $e->getMessage(); }?>
例の説明:
いずれかの条件が真でない場合、例外がスローされます。 🎜 >
customException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古いクラスのすべてのプロパティとメソッドを継承します。
「try」コード ブロックを実行すると、最初の条件では例外はスローされません。
電子メールには文字列「example」が含まれているため、2 番目の条件により例外がトリガーされます。
「キャッチ」コード ブロックは例外をキャッチし、適切なエラー メッセージを表示します。
customException がキャッチされない場合は、基本例外がしっかりとキャッチされ、例外はそこで処理されます。
例外の再スロー
例外がスローされたときに、標準の方法とは異なる方法で処理したい場合があります。例外は「catch」ブロックで再度スローできます。
スクリプトはシステム エラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーが簡単にできるように、わかりやすいメッセージを付けて例外を再度スローできます:
コードをコピー
コードは次のとおりです:
if(strpos($email) , “例”) !== FALSE) {
//メールが無効な場合は例外をスロー throw new
Exception($email) } } catch(Exception $e) {
//re- throwException throw new
customException($email); } }catch (customException $e) {
// カスタムメッセージを表示
echo $e->errorMessage() }
?>
例の説明:
上記のコードは、電子メール アドレスに文字列「example」が含まれているかどうかを検出します。その場合は、再度例外をスローします:
CustomException() クラスは、古い例外クラスの拡張として作成されました。このようにして、古いクラスのすべてのプロパティとメソッドを継承します。
errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。
$email 変数を有効な電子メール アドレスに設定しますが、文字列「example」が含まれます。
「try」ブロックには別の「try」ブロックが含まれているため、例外を再度スローできます。
電子メールに文字列「example」が含まれているため、例外がトリガーされます。
「catch」は例外をキャッチし、「customException」を再スローします。
「customException」をキャッチし、エラー メッセージを表示します。
例外が現在の「try」ブロックでキャッチされない場合は、より高いレベルで catch ブロックを探します。
トップレベル例外ハンドラーの設定
set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます。
function myException($Exception){
echo "Exception: " , $Exception->getMessage();
}
set_Exception_handler('myException')
throw new Exception('Uncaught Exception);発生しました') ;
?>
上記のコードの出力は次のようになります:
例外: キャッチされない例外が発生しました
上記のコードでは、 「キャッチ」コード ブロックはなく、代わりにトップレベルの例外ハンドラーをトリガーします。この関数は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。
例外ルール
例外処理を必要とするコードは、潜在的な例外をキャッチするために try ブロック内に配置する必要があります。
各 try ブロックまたは throw ブロックには、対応する catch ブロックが少なくとも 1 つ必要です。
複数の catch ブロックを使用して、さまざまな種類の例外をキャッチします。
例外は、try ブロック内の catch ブロックで再スローできます。
要するに: 例外がスローされた場合は、それをキャッチする必要があります。