PHP学習、常用常記(エラー処理、Exception)

9247 ワード

PHPでのデフォルトのエラー処理は簡単です.ファイル名、行番号、エラーを記述するメッセージを含むエラーメッセージがブラウザに送信されます.
PHPエラー処理
スクリプトとWebアプリケーションを作成する際には、エラー処理が重要な部分です.コードにエラー検出符号化が欠けている場合は、プログラムがプロフェッショナルではなく、セキュリティリスクにも扉を開けます.
基本的なエラー処理:die()関数の使用
if(!file_exists("welcome.txt")){
    die("     ");
}
else{
    $file=fopen("welcome.txt","r");
}

カスタムエラープロセッサの作成
カスタムエラープロセッサを作成するのは簡単です.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
すべてのエラーと警告.(PHP 5.4ではE_STRICTがE_ALLの一部となる)
function customError($errno, $errstr){
    echo "Error: [$errno] $errstr
"; echo " "; die(); }

エラーハンドラの設定
PHPのデフォルトエラーハンドラは内蔵のエラーハンドラです.上記の関数をスクリプト実行中のデフォルトのエラーハンドラに変更するつもりです.
エラーハンドラは、いくつかのエラーにのみ適用されるように変更できます.これにより、スクリプトは異なる方法で異なるエラーを処理できます.しかし、この例では、すべてのエラーに対してカスタムエラーハンドラを使用する予定です.
set_error_handler("customError");

カスタム関数がすべてのエラーを処理することを望んでいます.set_error_handler()には1つのパラメータしか必要ありません.2番目のパラメータを追加してエラーレベルを指定できます.
Error: [$errno] $errstr";
}

//         
set_error_handler("customError");

//     
echo($test);
?>

トリガエラー
入力データの位置入力が無効な場合にエラーをトリガーするのに役立ちます.PHPではtrigger_Error()関数が完了しました.
1){
    trigger_error("          1");
}
?>

スクリプト内の任意の場所でエラーをトリガーできます.2番目のパラメータを追加すると、トリガーされたエラーレベルを指定できます.
エラーのタイプ:
  • E_USER_ERROR-致命的なユーザーが生成したrun-timeエラー.エラーは回復できません.スクリプトの実行が中断されました.
  • E_USER_WARNING-致命的でないユーザが生成したrun-time警告.スクリプトの実行は中断されません.
  • E_USER_NOTICE-デフォルト.run-time通知.スクリプトがエラーを検出した場合に発生するか、スクリプトが正常に動作している場合に発生する可能性があります.
  • Error: [$errno] $errstr
    "; echo " "; die(); } // set_error_handler("customError",E_USER_WARNING); // $test=2; if ($test>1){ trigger_error(" 1",E_USER_WARNING); } ?>
    Error: [512]           1
        

    エラーレコード
    デフォルトではphp.iniのerror_log構成、PHPはサーバの記録システムまたはファイルにエラー記録を送信する.error_を使用することでlog()関数で、指定したファイルまたはリモート宛先にエラーレコードを送信できます.
    エラーメッセージをEメールで送信することは、指定したエラーの通知を得るための良い方法です.
    E-Mailによるエラーメッセージの送信
    function customError($errno, $errstr){
        echo "Error: [$errno] $errstr
    "; echo " "; error_log("Error: [$errno] $errstr",1, "[email protected]","From: [email protected]"); }

    この方法はすべての間違いに合わない.通常のエラーは、デフォルトのPHP記録システムを使用してサーバに記録する必要があります.
    異常とは何か
    PHP 5は、新しいオブジェクト向けのエラー処理方法を提供する.
    例外処理は、指定されたエラー(例外)が発生したときにスクリプトの通常のプロセスを変更するために使用されます.この場合を異常と呼ぶ.
    通常、例外がトリガーされると、次のことが起こります.
  • 現在のコード状態は
  • 保存する.
  • コードは、予め定義(カスタム)された例外プロセッサ関数
  • に切り替える.
  • 場合によっては、プロセッサは、保存するコード状態からコードの実行を再開し、スクリプトの実行を終了するか、コード内の別の場所からスクリプト
  • を実行し続ける可能性がある.
    異なるエラー処理方法を示します.
  • 異常の基本使用
  • カスタム例外プロセッサ
  • を作成する
  • 複数の異常
  • 異常
  • を再放出
  • 最上位例外プロセッサ
  • を設定する.
    注記:例外は、指定したポイントでコードの別の場所にジャンプするのではなく、エラーの場合にのみ使用する必要があります.
    異常の基本使用
    例外が投げ出されると、その後のコードは実行されず、PHPは一致する「catch」コードブロックを検索しようとします.
    異常がキャプチャされず、set_を使用する必要がない場合exception_handler()が対応する処理を行うと、重大なエラー(致命的なエラー)が発生し、「Uncautor Exception」(異常をキャプチャしていない)というエラーメッセージが出力されます.
    Try、throw、catch
    上記のインスタンスで発生するエラーを回避するには、例外を処理するために適切なコードを作成する必要があります.
    適切な処理例外コードには、次のものが含まれます.
  • Try-例外を使用する関数はtryコードブロック内にあるはずです.例外がトリガーされていない場合、コードは通常通り実行されます.しかし、異常がトリガーされると、異常が放出されます.
  • Throw-では、異常をどのようにトリガするかが規定されています.各「throw」は、少なくとも1つの「catch」に対応する必要があります.
  • Catch-「catch」コードブロックは、例外をキャプチャし、例外情報を含むオブジェクトを作成します.
  • 1)
        {
            throw new Exception("          1");
        }
            return true;
    }
        
    //   try       
    try
    {
        checkNum(2);
        //       ,        
        echo '       ,   $number   ';
    }
    //     
    catch(Exception $e)
    {
        echo 'Message: ' .$e->getMessage();
    }
    ?>

    しかしながら、「各throwはcatchに対応しなければならない」という原則に従うために、漏れたエラーを処理するために、最上位レベルの例外プロセッサを設定することができる.
    カスタムExceptionクラスの作成
    カスタム例外ハンドラの作成は簡単です.PHPに異常が発生した場合にその関数を呼び出すことができる専用クラスを簡単に作成した.このクラスはexceptionクラスの拡張子である必要があります.
    このカスタムcustomExceptionクラスはPHPのexceptionクラスのすべての属性を継承し、カスタム関数を追加できます.
    getLine().' in '.$this->getFile()
            .': '.$this->getMessage().'         E-Mail   ';
            return $errorMsg;
        }
    }
     
    $email = "[email protected]";
     
    try
    {
        //     
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
        {
            //             ,    
            throw new customException($email);
        }
    }
     
    catch (customException $e)
    {
    //display custom message
    echo $e->errorMessage();
    }
    ?>

    この新しいクラスは古いexceptionクラスのコピーであり,errorMessage()関数を加えている.古いクラスのコピーであるため、古いクラスから属性とメソッドを継承し、getLine()、getFile()、getMessage()などのexceptionクラスのメソッドを使用できます.
    複数の例外
    1つのスクリプトに複数の例外を使用して、さまざまな状況を検出できます.
    複数のifを使用できます..elseコードブロック、または1つのswitchコードブロック、または複数の例外をネストします.これらの例外は、異なるexceptionクラスを使用して、異なるエラーメッセージを返します.
    getLine().' in '.$this->getFile()
            .': '.$this->getMessage().'         E-Mail   ';
            return $errorMsg;
        }
    }
     
    $email = "[email protected]";
     
    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();
    }
    ?>

    customExceptionが例外を放出し、customExceptionが取得されず、base exceptionのみが取得された場合は、そこで例外を処理します.
    異常を投げ出す
    例外が投げ出されると、標準とは異なる方法で処理したい場合があります.1つの「catch」コードブロックで再び例外を放出できます.
    スクリプトは、ユーザーにシステムエラーを隠す必要があります.プログラマーにとって、システムエラーは重要かもしれませんが、ユーザーは興味を持っていません.ユーザーが使いやすいようにするには、ユーザーに友好的なメッセージを含む例外を再び投げ出すことができます.
    getMessage().'         E-Mail   。';
            return $errorMsg;
        }
    }
     
    $email = "[email protected]";
     
    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();
    }
    ?>

    現在のtryコードブロックに異常がキャプチャされていない場合、catchコードブロックはより高いレベルで検索されます.
    最上位レベルの例外プロセッサの設定
    set_exception_handler()関数は、取得されていないすべての例外を処理するユーザ定義関数を設定します.
    Exception: " , $exception->getMessage();
    }
     
    set_exception_handler('myException');
     
    throw new Exception('Uncaught Exception occurred');
    ?>

    「catch」コードブロックは存在せず、最上位レベルの例外ハンドラがトリガーされます.この関数を使用して、キャプチャされていないすべての例外をキャプチャする必要があります.
    異常な規則
  • 異常処理を必要とするコードは、潜在的な異常をキャプチャするためにtryコードブロック内に入れるべきである.
  • 各tryまたはthrowコードブロックは、少なくとも1つの対応するcatchコードブロックを有しなければならない.
  • は、複数のcatchコードブロックを使用して、異なる種類の例外をキャプチャすることができる.
  • は、tryコードブロック内のcatchコードブロックに異常を放出(再放出)することができる.

  • 簡単に言えば、例外が投げ出された場合は、それをキャプチャする必要があります.