如何扩展异常以发送电子邮件

时间:2011-06-03 13:42:06

标签: php

This user asked a similar question但答案中没有可行的解决方案,所以现在重新审视这个主题。

我希望以干净的方式从自定义例外发送电子邮件。我可以使用自定义error_handler中的普通旧错误轻松完成此操作,但是除了扩展异常之外,我有点难过。

主要问题是我依靠Zend_Mail来实现透明的跨平台邮件,轻松的smtp / ssl配置以及gmail帐户使用和其他一些好东西。我想在自定义异常中访问我的Zend_Mail对象。静态调用并不是我愿意使用的选项,尽管在自定义异常中使用第三方对象似乎最容易。这是基本异常类的构造函数:

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

我认为目前唯一值得考虑的解决方案是在扩展异常类中为邮件程序对象添加参数,但我不想要求所有子类都在mailer对象中传递。这个想法可能是这个邮件对象。最好是一个可选的依赖。

__构造签名将变为:

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

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

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

1 个答案:

答案 0 :(得分:1)

我会像这样接近它(我在这里错过了一些要求吗?)

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()),某人将收到一封电子邮件。