PHP istisna içeriği almak

3 Cevap php

PHP bir custom error handler kullanırsanız, bir hata bağlam (oluştuğu yerde tüm değişkenlerin değeri) görebilirsiniz. Istisnalar için bunu yapmak için herhangi bir yolu var mı? Ben bir istisna işleyici ayarı değil, içerik almak demek.

3 Cevap

You can attach the context to your exception manually. I have never tried it, but it would be interesting to create a custom exception that in the constructor calls and saves get_defined_vars() for later retrieval.
This will be a heavy exception :-)

proof of concept:

class MyException extends Exception()  {
    protected $throwState;

    function __construct()   {
        $this->throwState = get_defined_vars();
        parent::__construct();
    }

    function getState()   {
        return $this->throwState;
    }
}

daha iyi:

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());

PHP İstisnalar:

http://www.php.net/manual/en/language.exceptions.extending.php

Temel durum sınıfı yöntemleri:

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

Yani, bu temel bir durum yakalandı eğer çalışmak zorunda budur. Eğer o zaman bunu yakalamak zaman gitti atıldı hangi bağlam olarak daha fazla içerik almak konusunda yapılması gereken çok şey değil durum oluşturur kod üzerinde kontrole sahip değilseniz. Eğer istisna kendiniz üretiyorsanız, bu atılmış bulunuyor önce sonra istisna bağlamı ekleyebilirsiniz.

Ayrıca yapamadık:

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

Bu durum örneğini ve sonra atmak ihtiyacını önleyeceğini.