PHP簡易エラー処理

5285 ワード

PHPエラー処理
スクリプトとWebアプリケーションを作成する際には、エラー処理が重要な部分です.コードにエラー検出符号化が欠けている場合は、プログラムがプロフェッショナルではなく、セキュリティリスクにも扉を開けます.
このチュートリアルでは、PHPで最も重要なエラー検出方法について説明します.
さまざまなエラー処理方法について説明します.
  • 簡単な「die()」文
  • カスタムエラーおよびエラートリガ
  • エラーレポート
  • 基本的なエラー処理:die()関数の使用
    最初の例では、テキストファイルを開く簡単なスクリプトを示します.
    <?php
    $file=fopen("welcome.txt","r");
    ?>

    ファイルが存在しない場合は、次のようなエラーが発生します.
    Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: 
    No such file or directory in C:/webfolder/test.php on line 2

    ユーザーが上記のようなエラーメッセージを取得しないように、ファイルにアクセスする前に、ファイルが存在するかどうかを検出します.
    <?php
    if(!file_exists("welcome.txt"))
     {
     die("File not found");
     }
    else
     {
     $file=fopen("welcome.txt","r");
     }
    ?>

    ファイルが存在しない場合、このようなエラーメッセージが表示されます.
    File not found

    前のコードよりも、上記のコードが有効です.これは、エラー後にスクリプトを終了する簡単なエラー処理メカニズムを採用しているためです.
    ただし、スクリプトを簡単に終了するのは必ずしも適切な方法ではありません.エラー処理のための代替PHP関数について検討してみましょう.
    カスタムエラープロセッサの作成
    カスタムエラープロセッサを作成するのは簡単です.PHPでエラーが発生したときに呼び出すことができる専用関数を簡単に作成しました.
    この関数は、少なくとも2つのパラメータ(error levelおよびerror message)を処理する能力が必要ですが、最大5つのパラメータ(オプション:file、line-numberおよびerror context):
    構文
    error_function(error_level,error_message,
    error_file,error_line,error_context)

    パラメータ
    説明
    error_level
    必要です.ユーザー定義のエラーに対して、エラー・レポート・レベルを指定します.値の数でなければなりません.次の表を参照してください:エラーレポートレベル.
    error_message
    必要です.ユーザー定義のエラーに対してエラーメッセージを指定します.
    error_file
    オプション.エラーが発生したファイル名を指定します.
    error_line
    オプション.エラーが発生した行番号を指定します.
    error_context
    オプション.エラーが発生したときに使用される各変数とその値を含む配列を指定します.
    エラーレポートレベル
    これらのエラー・レポート・レベルは、エラー・ハンドラが処理しようとするエラーの異なるタイプです.

    定数
    説明
    2
    E_WARNING
    致命的でないrun-timeエラー.スクリプトの実行を一時停止しません.
    8
    E_NOTICE
    Run-time通知.スクリプトの検出にエラーが発生する可能性がありますが、スクリプトが正常に実行されている場合に発生する可能性があります.
    256
    E_USER_ERROR
    致命的なユーザーによって生成されたエラー.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_ERROR.
    512
    E_USER_WARNING
    致命的でないユーザーが生成した警告.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_WARNING.
    1024
    E_USER_NOTICE
    ユーザーが生成した通知.これは、プログラマがPHP関数trigger_を使用するのと同じです.Error()設定のE_NOTICE.
    4096
    E_RECOVERABLE_ERROR
    キャプチャ可能な致命的なエラー.類似E_ERRORは、ユーザ定義のプロセッサによってキャプチャされることができる.(set_error_handler()参照)
    8191
    E_ALL
    すべてのエラーと警告、レベルEを除くSTRICT以外.(PHP 6.0でE_STRICTはE_ALLの一部)
    次に、エラーを処理する関数を作成します.
    function customError($errno, $errstr)
     { 
     echo "<b>Error:</b> [$errno] $errstr<br />";
     echo "Ending Script";
     die();
     }

    上のコードは簡単なエラー処理関数です.トリガーされると、エラー・レベルとエラー・メッセージが取得されます.エラー・レベルとメッセージが出力され、スクリプトが終了します.
    これで、エラー処理関数を作成しました.この関数がいつトリガーされるかを決定する必要があります.
    Set Error Handler
    PHPのデフォルトエラーハンドラは内蔵のエラーハンドラです.上記の関数をスクリプト実行中のデフォルトのエラーハンドラに変更するつもりです.
    エラーハンドラは、いくつかのエラーにのみ適用されるように変更できます.これにより、スクリプトは異なる方法で異なるエラーを処理できます.ただし、この例では、すべてのエラーに対してカスタムエラーハンドラを使用する予定です.
    set_error_handler("customError");

    すべてのエラーを処理するためにカスタム関数を望んでいるので、set_error_handler()には1つのパラメータしか必要ありません.2番目のパラメータを追加してエラーレベルを指定できます.
    ≪インスタンス|Instance|emdw≫
    このエラーハンドラは、存在しない変数を出力しようとすることによってテストされます.
    <?php
    //error handler function
    function customError($errno, $errstr)
     { 
     echo "<b>Error:</b> [$errno] $errstr";
     }
    
    //set error handler
    set_error_handler("customError");
    
    //trigger error
    echo($test);
    ?>

    上記のコードの出力は、次のようになります.
    Error: [8] Undefined variable: test

    トリガエラー
    スクリプトにユーザーがデータを入力する場所は、ユーザーの入力が無効な場合にエラーをトリガーするのに役立ちます.PHPではtrigger_Error()が完了しました.

    この例では、「test」変数が「1」より大きい場合、エラーが発生します.
    <?php
    $test=2;
    if ($test>1)
    {
    trigger_error("Value must be 1 or below");
    }
    ?>

    上記のコードの出力は、次のようになります.
    Notice: Value must be 1 or below
    in C:/webfolder/test.php on line 6

    スクリプト内の任意の場所でエラーをトリガーできます.2番目のパラメータを追加すると、トリガーされたエラーレベルを指定できます.
    エラーのタイプ:
  • E_USER_ERROR-致命的なユーザーが生成したrun-timeエラー.エラーは回復できません.スクリプトの実行が中断されました.
  • E_USER_WARNING-致命的でないユーザが生成したrun-time警告.スクリプトの実行は中断されません.
  • E_USER_NOTICE-デフォルト.ユーザーが生成したrun-time通知.スクリプトでエラーが検出されたか、スクリプトが正常に実行されている場合に発生する可能性があります.


  • この例では、「test」変数が「1」より大きい場合、E_が発生するUSER_WARNINGエラー.E_が起こったらUSER_WARNINGでは、カスタムエラーハンドラを使用してスクリプトを終了します.
    <?php
    //error handler function
    function customError($errno, $errstr)
     { 
     echo "<b>Error:</b> [$errno] $errstr<br />";
     echo "Ending Script";
     die();
     }
    
    //set error handler
    set_error_handler("customError",E_USER_WARNING);
    
    //trigger error
    $test=2;
    if ($test>1)
     {
     trigger_error("Value must be 1 or below",E_USER_WARNING);
     }
    ?>
    

    上記のコードの出力は、次のようになります.
    Error: [512] Value must be 1 or below
    Ending Script