如果在PHP中使用custom error handler,则可以看到错误的上下文(所有变量在其发生位置的值)。有没有办法为例外做这件事?我的意思是获取上下文,而不是设置异常处理程序。
答案 0 :(得分:8)
您可以手动将上下文附加到您的例外。我从来没有尝试过,但创建一个自定义异常会很有趣,在构造函数中调用并保存get_defined_vars()
以便以后检索。
这将是一个很重要的例外: - )
概念证明:
class MyException extends Exception() {
protected $throwState;
function __construct() {
$this->throwState = get_defined_vars();
parent::__construct();
}
function getState() {
return $this->throwState;
}
}
更好:
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 :(得分:2)
PHP中的例外:
http://www.php.net/manual/en/language.exceptions.extending.php
基本异常类的方法:
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 :(得分: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;
}
}
这样可以避免实例化异常然后抛出它。