PHP完全独学マニュアルログイン
PHP完全独学マニュアル
著者:php.cn  更新時間:2022-04-15 13:53:54

PHP例外



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


例外とは

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

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

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

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

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

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

複数の例外

  • 例外を再スロー

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

  • 注:
  • 例外はエラー状況でのみ使用されるべきであり、ジャンプするために使用されるべきではありませんコード内の指定された位置の別の場所。
  • 例外の基本的な使用法
  • 例外がスローされると、後続のコードは実行を続行せず、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);
?>
上記のコードは次のようなエラーを受け取ります:


Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/php/test/test.php:7 Stack trace: #0 /www/php/test/test.php(13): checkNum(2) #1 {main} thrown in /www/php/test/test.php on line ;

Try, throw and catch

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

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

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

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

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

  2. <?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();
    }
    ?>
    上記のコードは次のようなエラーを受け取ります:

  3. Message: 变量值必须小于等于 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 = "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() などの例外クラスのメソッドを使用できます。

    例の説明:

    上記のコードは例外をスローし、カスタム例外クラスを通じてそれをキャッチします:

    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 = "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();
    }
    ?>

    例の説明:

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

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

    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');
    ?>
    上記のコードの出力は次のようになります:
    Exception: Uncaught Exception occurred
    上記のコードには、「catch」ブロックはなく、代わりに最上位の例外ハンドラーがトリガーされます。この関数は、キャッチされなかった例外をすべてキャッチするために使用する必要があります。

    例外ルール

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

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

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

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

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

PHP中国語ウェブサイト