PHPオブジェクト向けプログラミングと設計モード(4/5)-異常の定義、拡張、キャプチャ

11096 ワード

PHPプレミアムプログラミング学習ノート2014.06.12
例外は、プログラムの正常な実行中に発生するさまざまなタイプのエラーを処理するためによく使用されます.たとえば、データベース・リンクを作成する場合、データベース接続に失敗した場合を処理します.例外を使用すると、アプリケーションのフォールトトレランス特性が向上し、アプリケーションがより安定し、丈夫になります.
例外の使用
PHP 5は他の言語のような異常処理モジュールを追加した.PHPコードで発生した異常は、throw文によって投げ出され、catch文によってキャプチャされ得る.例外処理を行う必要があるコードはtryコードブロックに入れて、存在する可能性のある例外をキャプチャする必要があります.各tryは少なくとも1つのcatchブロックに対応する.複数のcatchを使用すると、異なるクラスで発生した例外をキャプチャできます.tryコードブロックが例外を放出しなくなったり、catchが放出された例外に一致することが見つからなかったりすると、PHPコードは最後のcatchにジャンプした後に実行されます.もちろん、PHPはcatchコードブロック内で再び異常を放出することを可能にする.
事前定義異常Exception
Exceptionクラスはすべての例外のベースクラスであり、Exceptionクラスを派生させることでカスタム例外の目的を達成することができます.次のリストは、Exceptionの基本情報を示しています.
Exception {

    /*    */
    protected string $message ;        //      
    protected int $code ;            //    
    protected string $file ;        //        
    protected int $line ;            //            

    /*    */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )    //      
    final public string getMessage ( void )            //        
    final public Exception getPrevious ( void )        //            
    final public int getCode ( void )                //      
    final public string getFile ( void )            //             
    final public int getLine ( void )                //                
    final public array getTrace ( void )            //        
    final public string getTraceAsString ( void )    //              
    public string __toString ( void )                //           
    final private void __clone ( void )                //    
}

Exceptionを理解したら、exceptionクラスを拡張してカスタム例外を実装してみましょう.
function connectToDatabase()
{    
    if(!$link = mysql_connect("myhost","myuser","mypassw","mybd"))
    {
        throw new Exception("could not connect to the database.");
    }
}

try
{
    connectToDatabase();
}
catch(Exception $e)
{echo $e->getMessage();
}

ここではクラスのExceptionタイプの例外を投げ出し、catchでこの例外をキャプチャし、最終的に「could not connect to the database.」を印刷しました.データベース接続に失敗した理由情報も表示したいかもしれません.以下、exceptionクラスを拡張することで、カスタム情報を実現します.
class MyException extends Exception
{
    protected $ErrorInfo;

    //
    public function __construct($message=null,$code=0)
    {
        $this->ErrorInfo = '           ';
        parent::__construct($message,$code);
    }    

    //             
    public function GetErrorInfo()
    {
        return $this->ErrorInfo;
    }

    /**
     *
     *           ,                 
     *
     */

    public function log($file)
    {
        file_put_contents($fiel,$this->__toString(),FILE_APPEND);
    }
}

function connectToDatabase()
{    
    throw new MyException("ErrorMessage");
}

try
{    
    connectToDatabase();
}
catch(MyException $e)
{    
    echo $e->getMessage() . "
"; echo $e->GetErrorInfo(); }

set_exception_handlerユーザー定義の例外処理関数の設定
未取得の例外が発生した場合に呼び出される関数名はset_として使用されます.exception_handlerのパラメータ.この関数はset_を呼び出す必要がありますexception_handler()は定義されています.この関数は、放出された例外オブジェクトであるパラメータを受け入れます.これにより、上述した異常記録ログ処理を改善することができる.
function ExceptionLogger($exception)
{
    $file='ExceptionLog.log';
    file_put_contents($fiel,$exception->__toString(),FILE_APPEND);
}

set_exception_handler(ExceptionLogger);

1.3、PHPはcatchコードブロック内で再び異常を放出することを許可する.
try
{
    #code...
}
catch(Exception $e)
{
    if($e->getCode() == 999)
    {
        #      
    }
    else
    {
        throw $e;
        
    }
}

まとめ
異常な機能は非常に強力ですが、プロジェクトで異常なメカニズム、特に異常ログを大量に使用できるメカニズムを乱用できるとは思いません.今回はシステムのオーバーヘッドを大幅に増加させ、アプリケーションのパフォーマンスを低下させます.エラーコードを利用して、エラー情報を簡単に管理することができます.エラー情報が何度も平らに投げ出された場合、エラーコードを使用するのは科学的な選択です.エラー・コードを使用して、エラー・メッセージもマルチ言語表示をサポートすることができます.