PHP対象プログラム設計(oop)学習ノート(四)-異常処理類Exception

4099 ワード

使用異常
PHP 5は他の言語と似た異常処理モジュールを追加しました。PHPコードで発生した異常は、throw文により投げられ、catch文に捕獲されます。異常処理が必要なコードはすべてtryコードブロックに入れて、可能な異常を捕捉しなければなりません。各tryは少なくとも一つの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();
}
setexception_handlerはユーザー定義の異常処理関数を設定します。
捕獲されていない異常が発生したときに呼び出す関数名をset_とします。exception_ハンドルのパラメータ。この関数は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;
    }
}
締め括りをつける
異常な機能は非常に強力ですが、プロジェクト内で異常なメカニズムを思う存分に乱用できるとは思いません。特に異常ログを大量に使う仕組みで、今回はシステムオーバーヘッドを大幅に増加し、アプリケーションの性能を低下させました。エラーコードを利用して、私達は簡単にエラー情報を管理できます。エラー情報が何度もフラットに投げ出された時、エラーコードを使うのは科学的な選択です。エラーコードによってエラーメッセージも多言語表示に対応できます。