2009-11-27 12 views

答えて

8

あなたは手動であなたの例外にコンテキストを添付することができます。私はそれを試みたことはありませんが、コンストラクタで後で取得するためにget_defined_vars()を呼び出して保存するというカスタム例外を作成することは面白いでしょう。
これは概念の

証明:-)重い例外になります。

class MyException extends Exception() { 
    protected $throwState; 

    function __construct() { 
     $this->throwState = get_defined_vars(); 
     parent::__construct(); 
    } 

    function getState() { 
     return $this->throwState; 
    } 
} 

さらに良い:PHPで

class MyException extends Exception implements IStatefullException() { 
    protected $throwState; 

    function __construct() { 
     $this->throwState = get_defined_vars(); 
     parent::__construct(); 
    } 

    function getState() { 
     return $this->throwState; 
    } 

    function setState($state) { 
     $this->throwState = $state; 
     return $this; 
    } 
} 

interface IStatefullException { function getState(); 
     function setState(array $state); } 


$exception = new MyException(); 
throw $exception->setState(get_defined_vars()); 
+1

Hmmですが、ここでget_defined_varsには例外を構成するコードのローカル変数は含まれません。 –

+0

本当に「例外」には目に見えない場合はありません。これを克服するには、例外をスローするときに 'setState(array $ state)'メソッドを追加し、 'get_defined_vars'を指定することをお勧めします。それに応じてコードを変更しました。 –

+0

これを行う正しい方法は、Andrewが以下に述べるとおりです。 *注:例外は変更できません!あなたがそれを投げたら、それは変わるべきではありません...なぜsetState()は悪い考えですか?)** PS:**これはSymfony(https://github.com//blob/master/vendor/symfony/debug/Exception/ContextErrorException.php)(免責事項:私はそれを書きました) – Christian

-2

eceptionsを処理するための同等の機能は次のとおりです。
set_exception_handler()

別の非常に便利な機能は次のとおりです。
debug_backtrace()

+0

はい、それは私の質問ではありません。私はすでに捕らえた例外からコンテキストを取得する必要があります。あなたの時間はありがとうございます –

+1

デフォルトでは、PHP例外にはその情報が含まれておらず、例外をキャッチした時点で、元のスタックフレームが既にポップされているため、必要なローカル変数などの情報は既に破棄されています。例外がスローされたコンテキストを制御できないため、そこにコンテキストを追加することができない場合、そのコンテキストを取得する方法はありません。 –

+0

はい、これは質問された質問には答えません。 – Octavian

1

例外:

http://www.php.net/manual/en/language.exceptions.extending.php

基本Exceptionクラスの3210の

方法:

final public function getMessage();  // message of exception 
final public function getCode();   // code of exception 
final public function getFile();   // source filename 
final public function getLine();   // source line 
final public function getTrace();   // an array of the backtrace() 
final public function getPrevious();  // previous exception 
final public function getTraceAsString(); // formatted string of trace 

だから、これはあなたが基本的な例外をキャッチした場合で動作するように持っているものです。例外を生成するコードを制御できない場合、スローされたコンテキストがキャッチするまでにコンテキストがなくなるため、コンテキストを取得することはあまりありません。あなた自身が例外を生成している場合、スローされる前に例外にコンテキストをアタッチできます。

2

は、あなたも行うことができませんでした。例外のインスタンスを作成し、それをスローする必要性を回避する

class ContextException extends Exception { 

    public $context; 

    public function __construct($message = null, $code = 0, Exception $previous = null, $context=null) { 
     parent::__construct($message, $code, $previous); 
     $this->context = $context; 
    } 

    public function getContext() { 
     return $this->context; 
    } 
} 

関連する問題