2013-07-19 89 views
2

我已经定义是这样我的自定义异常类:在Exception构造函数中调用方法是否可接受?

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

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

UPDATE

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

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

这种方法的问题是,它会弄乱堆栈跟踪

+0

看起来不错。为什么不 ? – BlitZ

+1

只要确保没有办法让异常处理程序抛出异常并最终陷入循环 – Anigel

+0

为什么创建静态方法,何时可以停止查询并在全局变量中使用函数? (因为这基本上是你现在正在做的) –

回答

1

Business logic in the constructor makes your code untestable.

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

+0

感谢您的评论,请看看我更新的问题 –

+0

@VladimirHraban您仍在记录错误的地方。 'catch'块应该采取适当的行动,比如记录。从可测试性和可重用性的角度来看,静态记录器也是一个糟糕的计划。一般规则(对于PHP)是,你认为你需要一个静态成员的任何东西,你不需要。 – DaveRandom

+0

在不同的地方可以抛出异常的地方有很多。我将不得不一遍又一遍地复制日志记录方法 –

1

请不要那样做,他们都不是。

只是为了描述在代码中发生的问题的异常。

建议在某处捕捉异常,然后处理异常,例如做日志记录,做出一些警告。

相关问题