Получить контекст исключений в PHP - PullRequest
5 голосов
/ 27 ноября 2009

Если вы используете пользовательский обработчик ошибок в PHP, вы можете увидеть контекст ошибки (значение всех переменных в месте, где она произошла). Есть ли способ сделать это для исключений? Я имею в виду получение контекста, а не установку обработчика исключений.

Ответы [ 3 ]

8 голосов
/ 27 ноября 2009

Вы можете прикрепить контекст к своему исключению вручную. Я никогда не пробовал, но было бы интересно создать собственное исключение, которое в конструкторе вызывает и сохраняет 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());
2 голосов
/ 08 февраля 2010

Не могли бы вы также сделать:

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

Это позволило бы избежать необходимости создавать исключение, а затем выбрасывать его.

2 голосов
/ 27 ноября 2009

Исключения в 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

Итак, с этим вам придется работать, если вы поймали основное исключение. Если у вас нет контроля над кодом, который генерирует исключение, тогда вам не нужно ничего делать, чтобы получить больше контекста, поскольку контекст, в который он был брошен, исчезает к тому времени, когда вы его поймаете. Если вы сами генерируете исключение, вы можете прикрепить контекст к исключению до того, как оно будет сгенерировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...