2

は、我々は通常、このように、インスタンス生成時にメッセージを設定しますオブジェクトの有効期間、このような何か:PHPの例外処理の設定メッセージは、その後

throw $this->my_exception; 

私は、同じオブジェクトを再利用しておりますので、私はあなたが見る、例外をthrowning前の任意の時点でメッセージを設定できるようにする必要がありますか?

+2

なぜ地球上でそのように機能しますか? Exceptionを再利用すると、既にスローしているので、行番号が間違っている可能性があります。新しいものを投げるのは何が問題なのですか? –

+0

私が尋ねることができるなら、あなたはそれを何のためにしますか? – NikiC

+0

@jakenoble:クライアントコードは、自分の好みの例外オブジェクトを注入できる必要があります。私はこれが奇妙に聞こえるが、私はそれが必要であることを知っている... – fabio

答えて

4

しないでください。これは、スタックトレースに再スローが含まれないため、例外をより詳細にトレースします。代わりに、あなたは$previous parameterを使用して、新しい例外を作る5.3+使用している場合:

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"); 

それはまだです例外は意味的な意味を持つことになります(したがって、LogicExceptionInvalidArgumentExceptionの存在)。しかし、それが必要な場合、それはそれを行う恐ろしい方法ではありません(例外をインスタンス化するのは恐ろしい方法です)。 ..

+0

私は彼が転覆しないと思う。彼はそれを投げずに単純に例外を作成し、それを後で投げます。 – NikiC

+0

@nikic:それはさらに悪いです... @ファビオ:なぜあなたはそれをやっていますか?例外を乱用することは非常に悪い考えです。例外的な状況でのみ適切に使用してください。それを投げる前に例外をインスタンス化する本当の理由はありません(または少なくとも投げ込みの直接の意図でインスタンス化しないでください)。彼らは安くはないので、あなたがする必要がない限りそれらを使用しないでください。 – ircmaxell

+0

@ircmaxell:私もそうだと思います。私は例外が発生する前に何らかの利益がある状況を考えることができません... – NikiC

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; 

を作成して投げることができます。

+1

+1両方... – ircmaxell

+0

+1あなたが –

+0

@jakenobleを知っているええ、えー......そうです:それは前に付加すると便利ですがございます例外メッセージは、例外が発生した論理ブロックを識別する文字列を含みます: '$ e-> setMessage(sprintf( 'Can not enqueue work:%s'、$ e-> getMessage));'。したがって、同じブロック内に複数のスローがあると、 'enqueuing work'に影響を与えます。すべての例外メッセージに同じ接頭辞を追加することなく、例外コンテキストを与えることで、デバッグが簡単になります。 –