PHP異常処理浅析

4722 ワード

PHPは二つの異常クラスを予約しました。ExceptionとErrException

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 ) // (array)
    final public string getTraceAsString ( void ) // (string)
    public string __toString ( void ) //
    final private void __clone ( void ) //
}

ErrorException  extends Exception  {
 
    /* */
    protected int $severity   ;
    /* */
   
    public __construct  ([ string $message  = ""  [, int $code  = 0  [, int $severity  = 1  [, string $filename  = __FILE__  [, int $lineno  = __LINE__  [, Exception  $previous  = NULL    ]]]]]] )
    final public int getSeverity  ( void )
    /* */
    final public string Exception::getMessage  ( void )
    final public Exception Exception::getPrevious  ( void )
    final public int Exception::getCode  ( void )
    final public string Exception::getFile  ( void )
    final public int Exception::getLine  ( void )
    final public array Exception::getTrace  ( void )
    final public string Exception::getTraceAsString  ( void )
    public string Exception::__toString  ( void )
    final private void Exception::__clone  ( void )
}
どうやって異常を捕獲しますか?
(1)PHPはtry...catchで使用できます。異常処理を行うコードはtryコードブロック内でなければなりません。

try {
    throw new Exception('exception test 1', 1001);
} catch(Exception $e) {
    echo $e->getMessage().'-'.$e->getCode();
}
(2)ユーザがカスタマイズできる異常処理関数[set_]exception_handler」は、try/catchで捕獲されていない異常に使用します。

function  exception_handler ( $e ) {
    echo  "Uncaught exception: "  ,  $e -> getMessage (),  "
" ;
}
 
set_exception_handler ( 'exception_handler' );
 
throw new  Exception ( 'Uncaught Exception' );
 
echo " ";
ser_を使うのが見えます。exception_handlerコールバック関数の異常処理は、後続のコードは実行されませんが、try-catchは可能です。
(3)PHPは多catchで異なるタイプの異常を捕捉し、catchコードブロック内で再度異常を発生させることができる。

//
class MyException extends Exception {
    public function __construct($message = '', $code = 0) {
 
    }
 
    public function myFunction() {
        echo 'just for test';
    }
}
 
try {
    throw new MyException('an error');
} catch (MyException $e) {
    echo $e->myFunction();
} catch (Exception $e) {
    echo $e->getMessage();
}
(4)PHP 5.5はfinallyキーワードをサポートしていますので、異常が発生したかどうかは気にしないでください。

比較できるのは以下の通りです

function doSomething() {
    $resource = createResource();
    try {
        $result = useResource($resource);
    } catch (Exception $e) {
        releaseResource($resource);
        log($e->getMessage());
        exit();
    }
    releaseResource($resource);
    return $result;
}
 
// finally
function doSomething2() {
    $resource = createResource();
    try {
        $result = useResource($resource);
        return $result;
    } catch (Exception $e) {
        log($e->getMessage());
        exit();
    } finally {
        releaseResource($resource);
    }
}