将未捕获的异常发送到特定方法

时间:2011-02-11 05:37:47

标签: php oop exception exception-handling

我有一个带有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()));
        }
    }
}

如果有人有更好的方法,我就是全部的目光。

2 个答案:

答案 0 :(得分:1)

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

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

set_exception_handler('exception_handler');

来自文档:

  

如果未在try / catch块中捕获异常,则设置默认异常处理程序。调用exception_handler后执行将停止

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

答案 1 :(得分:-1)

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

如文件中所述:

  

PHP异常系统甚至在抛出它们之前就会导致每个对象产生一定的开销。这需要细致的内存处理,仅建议用于系统关键异常(由您或用户无法控制)。对于更常见的事情,最好在自定义非异常对象上使用trigger_error。