PHP例外処理

例外は、指定されたエラーが発生したときにスクリプトの通常のフローを変更するために使用されます。


例外とは何ですか?

PHP 5 は、新しいオブジェクト指向のエラー処理メソッドを提供します。

例外処理は、指定されたエラー (例外) 状況が発生したときにスクリプトの通常のフローを変更するために使用されます。この状況を例外と呼びます。

例外がトリガーされると、通常は次のことが起こります:

· 現在のコードの状態が保存されます

· コードの実行が事前定義された (カスタム) 例外ハンドラー関数に切り替わります

· 状況に応じて、ハンドラー保存されたコード状態からコード実行を再開するか、スクリプト実行を終了するか、コード内の別の場所からスクリプト実行を継続します

さまざまなエラー処理方法を示します:

· 例外の基本的な使用法

· Define によって作成例外ハンドラー

・複数の例外

・例外を再スロー

・トップレベルの例外ハンドラーを設定

: 例外はエラー状況でのみ使用する必要があり、特定の場所では使用しないでください。 クリックすると、別の場所にジャンプしますコード。


例外の基本的な使い方

例外がスローされると、後続のコードは実行を続行せず、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);
?>

上記のコードは次のようなエラーを受け取ります:

致命的なエラー:例外「例外」をキャッチしましたD:WWW11.php:7 に「値は 1 以下である必要があります」というメッセージが含まれる スタックトレース: #0 D:WWW11.php(13): checkNum(2) #1 {メイン} D:WWW11.php の 7 行目にスローされます


試して、投げて、キャッチしてください

上記の例で見られるエラーを回避するには、例外を処理する適切なコードを作成する必要があります。

適切な例外処理コードには以下を含める必要があります:

1. Try - 例外を使用する関数は「try」コード ブロック内に配置する必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。

2. スロー - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。

3. Catch - 「catch」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します。


インスタンス

例外をトリガーしましょう:

<?php
header("Content-type:text/html;charset=utf-8");
// 创建一个有异常处理的函数
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 以下

コメント: throw new Exception 明示的に例外をスローします

例の説明:

上記のコードは例外をスローし、それをキャッチします:

1. checkNum() 関数を作成します。数値が 1 より大きいかどうかを検出します。その場合は、例外をスローします。

2. 「try」コードブロックで checkNum() 関数を呼び出します。

3. checkNum() 関数で例外がスローされます。

4. catch" コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。

5. この例外オブジェクトから $e->getMessage() を呼び出すと、例外エラーからの出力が返されます。

ただし、「各スローはキャッチに対応する必要がある」という原則に従うために、欠落したエラーを処理する最上位の例外ハンドラーを設定できます


カスタム例外クラスを作成する

カスタム例外ハンドラーの作成は非常に簡単です。 PHP で例外が発生したときに関数が呼び出される特殊なクラスを作成しただけです。このクラスは例外クラスの拡張である必要があります。

このカスタム例外クラスは、PHP の例外クラスのすべてのプロパティを継承しており、カスタム関数を追加できます。

例外クラスを作成することから始めます:

<?php
header("Content-type:text/html;charset=utf-8");
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);
    }
}
catch (customException $e)
{
//display custom message
    echo $e->errorMessage();
}
?>

この新しいクラスは、古い例外クラスのコピーに errorMessage() 関数を加えたものです。古いクラスのコピーであるため、古いクラスからプロパティとメソッドが継承され、getLine()、getFile()、getMessage() などの例外クラスのメソッドを使用できます。

getLine(): 例外が発生したファイル内のコードの行番号を取得します

getFile(): 例外が発生したプログラムファイルの名前を取得します

getMessage(): Get例外メッセージの内容


例の説明:

上記のコードは例外をスローし、カスタム例外クラスを通じてキャッチします。作成する古い例外クラス。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。

2. errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。

3. $email 変数を不正な電子メール アドレス文字列に設定します。

4. 電子メール アドレスが無効であるため、「try」コード ブロックを実行して例外をスローします。

5. 「catch」コード ブロックは例外をキャッチし、エラー メッセージを表示します。


複数の例外

スクリプトに複数の例外を使用して、複数の状況を検出できます。

複数の if..else コード ブロックまたは switch コード ブロックを使用したり、複数の例外をネストしたりできます。これらの例外は、異なる例外クラスを使用し、異なるエラー メッセージを返す可能性があります。

<?php
header("Content-type:text/html;charset=utf-8");
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();
}
?>


例の説明:

上記のコードは、条件のいずれかが true でない場合、2 つの条件をスローします。例外:

1.customException() クラスは、古い例外クラスの拡張として作成されます。このようにして、古い例外クラスのすべてのプロパティとメソッドを継承します。

2. errorMessage() 関数を作成します。電子メール アドレスが無効な場合、この関数はエラー メッセージを返します。

3. $email 変数を、有効な電子メール アドレスであるが、文字列「example」を含む文字列に設定します。

4. 「try」コード ブロックを実行すると、最初の条件では例外はスローされません。

5. 電子メールには文字列「example」が含まれているため、2 番目の条件によって例外がトリガーされます。

6. 「catch」コード ブロックは例外をキャッチし、適切なエラー メッセージを表示します。

customException クラスが例外をスローしたが、customException がキャッチされず、基本例外のみがキャッチされた場合、例外はそこで処理されます。


例外の再スロー

例外がスローされたときに、標準とは異なる方法で処理したい場合があります。例外は「catch」ブロックで再度スローできます。

スクリプトはシステムエラーをユーザーから隠す必要があります。システム エラーはプログラマにとって重要かもしれませんが、ユーザーはそれらに興味がありません。ユーザーが簡単にできるように、わかりやすいメッセージを付けて例外を再度スローできます

例外:

<?php
 header("Content-type:text/html;charset=utf-8");
 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
header("Content-type:text/html;charset=utf-8");
function myException($exception)
{
    echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

上記のコードの出力は次のとおりです:

例外: キャッチされない例外が発生しました

上記のコードには、「キャッチ」コードはありませんブロック、および最上位の例外ハンドラーをトリガーします。この関数は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。


例外ルール

· 例外処理を必要とするコードは、潜在的な例外をキャッチするために try コード ブロックに配置する必要があります。

· 各 try または throw コード ブロックには、対応する catch コード ブロックが少なくとも 1 つ必要です。

· 複数の catch コード ブロックを使用して、さまざまな種類の例外をキャッチします。

· try ブロック内の catch ブロックで例外をスロー (再度スロー) できます。

要するに: 例外がスローされた場合は、それをキャッチする必要があります。


学び続ける
||
<?php header("Content-type:text/html;charset=utf-8"); // 创建一个有异常处理的函数 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(); } ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜