在Exception构造函数中调用方法是否可以接受?

时间:2013-07-19 10:40:20

标签: php

我的自定义异常类定义如下:

class EPPException extends Exception
{
    public function __construct($text, $code, $message = null) 
    {
        EPPHelper::logError($text, $code, $this->getTraceAsString, $message);
        parent::__construct($text, $code, null);
    }
}

抛出异常

throw new EPPException($text, $code, $message);

我的问题是 - 从设计的角度来看,使用构造函数不仅可以初始化对象,还可以执行一些额外的任务,例如在这种情况下调用静态方法,这是否可以接受?

更新

另一种选择是创建一个处理日志记录并抛出异常的静态方法

class EPPException extends Exception
{
    public function __construct($text, $code, $message = null) 
    {       
        parent::__construct($text, $code, null);
    }
}

public static function raiseException($text, $code, $message = mull)
{
    EPPHelper::logError($text, $code, $this->getTraceAsString, $message);
    throw new EPPException($text, $code, $message);
}

EPPHElper::raiseExeption($text, $code);

这种方法的问题在于它会弄乱堆栈跟踪

2 个答案:

答案 0 :(得分:1)

没有

Business logic in the constructor makes your code untestable.

除此之外,执行日志记录不是异常或其发射器的作用,异常处理程序的作用是采取适当的操作,其中可能包括在某处记录错误。

答案 1 :(得分:1)

请不要那样做,也不要那样做。

仅用于描述代码中出现的问题的例外。

建议在某个地方捕获异常,然后处理异常,例如,记录,发出一些警告。