【问题标题】:Send uncaught exceptions to a particular method将未捕获的异常发送到特定方法
【发布时间】:2011-02-11 05:37:47
【问题描述】:

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

如果有人有更好的方法,我是所有的眼睛。

【问题讨论】:

    标签: php oop exception exception-handling


    【解决方案1】:

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

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

    来自文档:

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

    另外,你不需要重写构造函数,如果没有重写,父类的构造函数会被自动调用。

    【讨论】:

    • @TheDisintegrator 我建议创建一个由show 实例方法调用的static 辅助方法,这样,是的,你可以做到MyException::show
    • 我对广告很感兴趣,我是 oop 的新手,来自程序。所以现在我比以前更迷茫了……
    • 好的,现在我们又来了。你能向我解释一下调用我的方法的静态方法吗?谢谢
    【解决方案2】:

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

    如文档中所述:

    PHP 异常系统甚至在它们被抛出之前就会对每个对象造成一定的开销。这需要细致的内存处理,并且仅推荐用于系统严重异常(您或用户无法控制)。对于更常见的事情,最好在自定义非异常对象上使用 trigger_error。

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多