2017-10-09 3 views
2

奇妙なことに、私は基底Exceptionクラスのような同じインタフェースを持つクラスを作成しましたが、そこから拡張/派生しません。ちょうど例外のように振る舞うためにちょうど古いプレーンPHPオブジェクト。私はこれが説明されたように動作しないことを知っていたhereしかし、とにかくすべての例外の後に通常のクラスのように試してみました。PHP、例外は通常のクラスとどう違うのですか

class MyException { 

/** 
* properties omitted 
*/ 

public function __construct(string $message = "",int $code) 

public function getMessage(void) 

//more methods 
} 

// somewhere in code block 

    throw new MyException("Fatal error"); 
    // Fatal error: exceptions must be valid objects derived from exception base class. 

例外は、通常のクラスとは異なり、私たちのコードで例外的な役割を果たす方法を説明できますか?私はこれが愚かな質問かもしれないことを知っていますが、私は例外が実際にどのように機能しているかについてもっと理解することを望んでいました。

+1

[throwables](http://php.net/manual/en/class.throwable.php)のみがスローされます。どんなクラスでもない。それは単なる言語ルールです。 – apokryfos

答えて

2

例外は通常のクラスです。 PHPはすべての必須メソッド/プロパティ(デフォルトのPHP例外ハンドラで使用されている)があるかどうかをチェックしたくないので、 'Exception'を拡張する必要があります。

クラスを拡張する(またはインターフェイスを実装する)ことによって、クラスに 'getMessage()'のようなメソッドがあり、既存のメソッドについてのエラーが発生しないことが証明されます。

これは、すべてのThrowableインタフェースメソッド(http://php.net/manual/en/class.throwable.php)を実装しなければならない:Exceptionクラスは、プログラマが例外に関する情報を渡すために使用するだけで、容器(エラーコード、メッセージ、位置、スタックで

Throwable { 
    /* Methods */ 
    abstract public string getMessage (void) 
    abstract public int getCode (void) 
    abstract public string getFile (void) 
    abstract public int getLine (void) 
    abstract public array getTrace (void) 
    abstract public string getTraceAsString (void) 
    abstract public Throwable getPrevious (void) 
    abstract public string __toString (void) 
} 
1

をトレース、その他の例外の処理に役立つ情報)をプログラムの一部(例外が発生した場所)からプログラムの他の部分(処理方法を知っているコードがある場所)にコピーします。

コンストラクタは、受け取った値を引数として格納するだけです。他の方法はゲッターだけです。それらは、Exceptionオブジェクトから値を抽出するために使用されます。 Exceptionクラスは動作を実装しません。

Exceptionを拡張する必要はありませんが、特別なことはありません。

+0

これは、例外が解析時にクラスだけでなく特別なものとして認識されることを示唆していますか? –

関連する問題