如何将例外扩展到发送电子邮件


How can one extend exception to send emails

这个用户问了一个类似的问题,但答案中没有可行的解决方案,所以我再次讨论这个话题。

我希望以一种干净的方式从自定义例外发送电子邮件。我可以很容易地处理来自自定义error_handler的普通旧错误,但对于扩展的异常,我有点困惑。

主要问题是我依赖Zend_Mail来提供透明的跨平台邮件、用于gmail帐户使用的简单smtp/ssl配置以及其他一些好处。我想在自定义异常中访问我的Zend_Mail对象。静态调用并不是我真正愿意使用的选项,尽管在自定义异常中使用第三方对象似乎是最容易的。以下是基本异常类的构造者:

 public function __construct($message = null, $code = 0,
                             Exception $previous = null);

我认为目前唯一有价值的解决方案是在扩展异常类中为mailer对象添加一个参数,但我不想要求所有子类都传入mailer对象。这个想法是,也许这个mailer对象最好是一个可选的依赖项。

__构造签名将变成:

      public function __construct($mailobj = null, $message = null, $code = 0,
                                  Exception $previous = null);  

注意参数的顺序,只需要$代码,并且它位于签名的中间!这带来了另一个问题,但这是另一天的事。我今天的问题是,有人对如何处理自定义异常类中的依赖关系有想法/建议吗?请记住,我们的目标是可测试的代码。

另一个简单的选择是将邮件代码放在catch块中,但在我看来,这有点违背了使用自定义异常的目的,因为这个类的客户端现在必须考虑在所有catch块添加邮件代码。

我会这样处理它(我在这里错过了一些要求吗?)

class CustomException extends Exception // Zend_Exception?
{
    public function __construct($message = null, $code = 0, Exception $previous = null) {
        $mailobj = new Zend_Mail(/* ... */);
        // ....
        try {  // In order not to get infinitelly looped
            $mailobj->send(/*...*/);
        } catch(Exception $e) { }
    }
}

每当实例化此异常(即throw new CustomException())时,就会有人收到电子邮件。