2011-02-11 65 views
1

我有一个自定义异常类与show()方法,以美丽的方式显示异常。
在某些致命错误中,我遗留了未捕获的异常,所以程序中间存在,但我希望这些异常可以用show方法显示。
可以这样做吗?发送未捕获的异常到一个特定的方法

class MyException extends Exception 
{ 
    public $e; 
    public function _contruct($message, $code = 0) 
    { 
     parent::_construct($message, $code); 
    } 

    public function show() 
    { 
     if(!defined('DEBUG')) define('DEBUG', FALSE); 
     p("Error: " . $this->getMessage()); 
     if(DEBUG) 
     { 
      p('Stack trace'); 
      p($this->getFile() . ' (' . $this->getLine() . ')'); 
      pre(get_dump($this->getTraceAsString())); 
     } 
    } 
} 

解决方案

class MyException extends Exception 
{ 
    public $e; 
    public function _contruct($message, $code = 0) 
    { 
     parent::_construct($message, $code); 
    } 

    public function show() 
    { 
     MyException::realShow($this); 
    } 

    static function realShow($e) 
    { 
     if(!defined('DEBUG')) define('DEBUG', FALSE); 
     p("Error: " . $e->getMessage()); 
     if(DEBUG) 
     { 
      p('Stack trace'); 
      p($e->getFile() . ' (' . $e->getLine() . ')'); 
      pre(get_dump($e->getTraceAsString())); 
     } 
    } 
} 

如果有人有更好的办法,我是所有人的目光。

function exception_handler($ex) { 
    //$ex will be the thrown Exception object 
} 

set_exception_handler('exception_handler'); 

从文档:

回答

1

当然,你可以使用set_exception_handler功能设置未捕获的异常处理函数

设置默认的异常处理程序,如果一个异常没有在try抓/ catch块。调用exception_handler后执行将停止

此外,您不需要重写构造函数,如果未覆盖父类的构造函数,它将自动调用。

+0

是这样的? set_exception_handler( 'MyException ::显示'); – 2011-02-11 05:47:19

-1

您不应该在PHP中使用异常系统。

如文档中表示:

PHP的例外制度使每个对象的某些费用他们甚至抛出了。这需要细致的内存处理,并且仅建议用于系统严重性异常(您或用户无法控制)。对于更常见的情况,最好在定制的非Exception对象上使用trigger_error。