PHPの例外処理2024 年の最新の入門チュートリアル。このコースでは 何の異常です,基本的な使用の例外,試してみてください、投げるとキャッチ,例としては、説明します。,カスタム例外クラスを作成します。,例としては、説明します。,複数の例外,例としては、説明します。,再スロー,例としては、説明します。,トップレベルの例外ハンドラセット,例外規則, について学習できます。
通常のフローを指定したときにスクリプトエラーを変更するための例外が発生します。
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
上記の例に現れるエラーを回避するために、我々は、例外を処理するための適切なコードを作成する必要があります。
適切な取り扱い例外コードが含まれている必要があります
例外をトリガしてみましょう:
<?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
上記のコードは、例外をスローし、それをキャッチ:
しかし、原則として「キャッチに対応しなければならないすべてのスローを「追跡するために、あなたは逃したエラーを処理するために、トップレベルの例外ハンドラを設定することができます。
カスタム例外ハンドラを作成することは非常に簡単です。 私たちは、単にあなたがその機能を呼び出すことができ、例外は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 = "someone@exampleja.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()などの例外クラスのメソッドを使用することができます。
上記のコードは、例外をスローし、カスタム例外クラスを介して、それをキャプチャします:
あなたは、さまざまな状況を検出するためのスクリプトとして複数の例外を使用することができます。
あなたは、複数のifjaelseブロック、またはコードスイッチのブロック、または巣複数の例外を使用することができます。 これらの例外は別の例外クラスを使用して、別のエラーメッセージを返すことができます。
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@example.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(); } ?>
上記のコードは、任意の1つの条件が満たされない場合は、例外をスローし、二つの条件をテストします。
customExceptionクラスの例外がスローさだけベースの例外は、ハンドルの例外を捕捉し、customExceptionをキャッチされていない場合。
例外がスローされたときに時々、あなたはそれを処理する標準的な方法とは異なるしたい場合があります。 再び「キャッチ」ブロックでスローされることがあります。
スクリプトは、ユーザーのシステム・エラーから隠されるべきです。 プログラマのため、システムエラーが重要かもしれませんが、ユーザーはそれらに興味を持っていないです。 それが簡単に、ユーザーが使用できるようにするためには、比較的ユーザーフレンドリーなメッセージで再び例外をスローすることができます。
<?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(); } ?>
それが文字列 "例"が含まれている場合、上記のコードは、電子メールアドレスで検出されました。 ある場合は、もう一度、例外がスローされます。
例外は、現在の "しよう"ブロックでキャッチされていない場合は、上位レベルの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
上記のコードでは、そこには「キャッチ」ブロックではありませんが、トップレベルの例外ハンドラがトリガさ。 この機能は、すべてのキャッチされない例外を捕捉するために使用されるべきです。
要するに:あなたは例外をスローした場合、あなたはそれをキャッチしなければなりません。