在PHP中获取异常上下文

时间:2009-11-27 15:39:59

标签: php exception error-handling

如果在PHP中使用custom error handler,则可以看到错误的上下文(所有变量在其发生位置的值)。有没有办法为例外做这件事?我的意思是获取上下文,而不是设置异常处理程序。

3 个答案:

答案 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;
    }
}

这样可以避免实例化异常然后抛出它。