2

通常、次のようにインスタンス化時にメッセージを設定します。

throw new Exception($msg);`

しかし、私はデフォルトの例外オブジェクトがインスタンス変数に格納されており、オブジェクトの存続期間を通じて次のように使用している状況にあります。

throw $this->my_exception;

同じオブジェクトを再利用しているので、例外をスローする前にいつでもメッセージを設定できる必要がありますね。

4

2 に答える 2

6

カスタム例外を作成します。

class MyException extends Exception
{
    public function setMessage($message) {
        $this->message = $message;
    }
}

そして、この例外を作成してスローすることができます

$this->exception = new MyException;
// ...
$this->exception->setMessage('Bad stuff happened');
throw $this->expection;

正直なところ、なぜそんなことをするのかわかりませんが。

于 2011-01-20T14:12:26.783 に答える
4

そうしないでください。例外のトレースが難しくなります(スタックトレースには再スローが含まれないため)。代わりに、5.3以降を使用している場合は、$previousパラメーターを使用して新しい例外を作成します。

throw new Exception("message", 0, $this->my_exception);

5.3未満を使用している場合でも、例外クラスを拡張して追加できます...

編集:わかりました、あなたのコメントに基づいて、私はあなたが今何をしようとしているのかわかります。クラスに構成可能な例外をスローさせたいとします。私がすることは、文字列クラス名を取り込んでそれを格納することです。文字列$this->my_exceptionになります。から拡張されていないものをスローすることはできないため、格納する前に例外クラスであることを確認する必要がありますException

if (!is_subclass_of($this->my_exception, 'Exception')) {
    //Error out, since you can't throw that class name
}

次に、投げる時間になると:

$class = $this->my_exception;
throw new $class("MyMessage");

LogicException例外には意味的な意味があるはずなので(したがってとの存在)、それはまだ素晴らしいことではありませんInvalidArgumentExceptionが、それが要件である場合、それはそれを行うための恐ろしい方法ではありません(ただし、例外を事前にインスタンス化することはそれを行うための恐ろしい方法です)。 ..

于 2011-01-20T14:12:13.397 に答える