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. PHP PHP以外のファイルで変数を取得する(例:MP4)
- 3. mkdirコンテキストの例PHP
- 4. 外部コンテキストからプロパティデータを取得
- 5. 取得例外:org.hibernate.exception.sqlgrammarexception
- 6. 取得例外が
- 7. は、nullポインタ例外を取得::ラインでnullポインタ例外を取得する1.3
- 8. ジャージー例外マッピング別のコンテキスト
- 9. 私の例外クラスで例外の行を取得
- 10. startActivityForResult NULLポインタ例外です。コンテキスト?
- 11. アプリケーションでランタイム例外を取得する
- 12. C++例外でスタックトレースを取得する
- 13. レスポンスコンポーネントでヌルポインタ例外を取得する
- 14. ソケットで例外オブジェクトを取得する
- 15. Pythonで例外の詳細を取得
- 16. ジャスパー例外の取得
- 17. 例外の取得 'NSRangeException'
- 18. 例外の取得 - CordaM13に
- 19. RequestEntityTooLarge例外の取得
- 20. ブースト:asio取得例外
- 21. 取得:TypeError例外:パイソン3.2.3
- 22. パーズ例外の取得
- 23. 例外ブロックの取得ScheduledExecutorService
- 24. LocationListener内でコンテキストを取得
- 25. googlemapsactivityでコンテキストを取得
- 26. SyncAdapter内でコンテキストを取得
- 27. nullポインタ例外を返すコンテキスト
- 28. com.install4j.runtime.launcher.WinLauncher.main(WinLauncher.java:26)での例外の取得
- 29. javax.cryptoでのパディング例外の取得
- 30. PHPで外部キーを取得
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