custom error handlerをPHPで使用すると、エラーのコンテキスト(発生した場所のすべての変数の値)を見ることができます。例外のためにこれを行う方法はありますか?コンテキストを取得し、例外ハンドラを設定しないことを意味します。PHPで例外コンテキストを取得
答えて
あなたは手動であなたの例外にコンテキストを添付することができます。私はそれを試みたことはありませんが、コンストラクタで後で取得するために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());
eceptionsを処理するための同等の機能は次のとおりです。
set_exception_handler()
別の非常に便利な機能は次のとおりです。
debug_backtrace()
はい、それは私の質問ではありません。私はすでに捕らえた例外からコンテキストを取得する必要があります。あなたの時間はありがとうございます –
デフォルトでは、PHP例外にはその情報が含まれておらず、例外をキャッチした時点で、元のスタックフレームが既にポップされているため、必要なローカル変数などの情報は既に破棄されています。例外がスローされたコンテキストを制御できないため、そこにコンテキストを追加することができない場合、そのコンテキストを取得する方法はありません。 –
はい、これは質問された質問には答えません。 – Octavian
例外:
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
だから、これはあなたが基本的な例外をキャッチした場合で動作するように持っているものです。例外を生成するコードを制御できない場合、スローされたコンテキストがキャッチするまでにコンテキストがなくなるため、コンテキストを取得することはあまりありません。あなた自身が例外を生成している場合、スローされる前に例外にコンテキストをアタッチできます。
は、あなたも行うことができませんでした。例外のインスタンスを作成し、それをスローする必要性を回避する
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;
}
}
。
- 1. Spring 3.0例外ハンドラでのコンテキスト情報の取得
- 2. 外部コンテキストからプロパティデータを取得
- 3. mkdirコンテキストの例PHP
- 4. 私の例外クラスで例外の行を取得
- 5. Pythonで例外の詳細を取得
- 6. アプリケーションでランタイム例外を取得する
- 7. C++例外でスタックトレースを取得する
- 8. 例外の取得 'NSRangeException'
- 9. 取得:TypeError例外:パイソン3.2.3
- 10. パーズ例外の取得
- 11. startActivityForResult NULLポインタ例外です。コンテキスト?
- 12. LocationListener内でコンテキストを取得
- 13. SyncAdapter内でコンテキストを取得
- 14. javax.cryptoでのパディング例外の取得
- 15. nullポインタ例外を返すコンテキスト
- 16. PHPで外部キーを取得
- 17. Python:例外のエラーメッセージを取得する
- 18. TypeError例外を取得:未定義
- 19. ファーストチャンス例外の行番号を取得
- 20. 例外時にユーザーエクスペリエンスを取得する
- 21. 例外のメソッドのパラメータ値を取得
- 22. tweepy例外インスタンスからエラーコードを取得
- 23. RESTEasyモック対例外マッパー対コンテキスト
- 24. Imが例外を取得するTypeload例外は何ができますか?
- 25. 例外:このフレーム例外のセキュリティ記述子を取得できません
- 26. PHP例外カスタムメッセージ
- 27. 例外XML + PHP
- 28. PHPの例外
- 29. DX9.0cのcurrentDeviceコンテキストを取得
- 30. `wreq`例外処理の取得/ポスト
Hmmですが、ここでget_defined_varsには例外を構成するコードのローカル変数は含まれません。 –
本当に「例外」には目に見えない場合はありません。これを克服するには、例外をスローするときに 'setState(array $ state)'メソッドを追加し、 'get_defined_vars'を指定することをお勧めします。それに応じてコードを変更しました。 –
これを行う正しい方法は、Andrewが以下に述べるとおりです。 *注:例外は変更できません!あなたがそれを投げたら、それは変わるべきではありません...なぜsetState()は悪い考えですか?)** PS:**これはSymfony(https://github.com//blob/master/vendor/symfony/debug/Exception/ContextErrorException.php)(免責事項:私はそれを書きました) – Christian