通常、次のようにインスタンス化時にメッセージを設定します。
throw new Exception($msg);`
しかし、私はデフォルトの例外オブジェクトがインスタンス変数に格納されており、オブジェクトの存続期間を通じて次のように使用している状況にあります。
throw $this->my_exception;
同じオブジェクトを再利用しているので、例外をスローする前にいつでもメッセージを設定できる必要がありますね。
通常、次のようにインスタンス化時にメッセージを設定します。
throw new Exception($msg);`
しかし、私はデフォルトの例外オブジェクトがインスタンス変数に格納されており、オブジェクトの存続期間を通じて次のように使用している状況にあります。
throw $this->my_exception;
同じオブジェクトを再利用しているので、例外をスローする前にいつでもメッセージを設定できる必要がありますね。
カスタム例外を作成します。
class MyException extends Exception
{
public function setMessage($message) {
$this->message = $message;
}
}
そして、この例外を作成してスローすることができます
$this->exception = new MyException;
// ...
$this->exception->setMessage('Bad stuff happened');
throw $this->expection;
正直なところ、なぜそんなことをするのかわかりませんが。
そうしないでください。例外のトレースが難しくなります(スタックトレースには再スローが含まれないため)。代わりに、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
が、それが要件である場合、それはそれを行うための恐ろしい方法ではありません(ただし、例外を事前にインスタンス化することはそれを行うための恐ろしい方法です)。 ..