【问题标题】:How can one extend exception to send emails如何扩展例外以发送电子邮件
【发布时间】:2011-09-07 20:13:27
【问题描述】:

This user asked a similar question 但在答案中没有可行的解决方案,所以这里是重新讨论这个话题。

我希望以简洁的方式从自定义异常发送电子邮件。我可以通过自定义 error_handler 中的普通旧错误轻松做到这一点,但是对于扩展的异常,我有点难过。

主要问题是我依靠 Zend_Mail 来实现透明的跨平台邮件、用于 gmail 帐户使用的简单 smtp/ssl 配置以及许多其他好东西。我想在自定义异常中访问我的 Zend_Mail 对象。静态调用并不是我真正愿意使用的选项,尽管在自定义异常中使用 3rd 方对象似乎是最容易的。下面是异常基类的构造函数:

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

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

__construct 签名将变为:

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

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

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

【问题讨论】:

    标签: php


    【解决方案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() ),就会有人收到一封电子邮件。

    【讨论】:

    • 嘿,这是一个有点有趣的选项。我不确定是否可以在异常中抛出和捕获异常,当我测试它时我们会很快发现。这个简单的场景让我重新考虑了异常的价值,考虑到在普通的错误处理程序中这样做是多么容易。虽然公平地说,我确实在错误处理程序中使用了静态变量,但在错误处理程序中实现自定义错误行为似乎仍然比在异常中容易得多。感谢您的反馈朋友。
    • 我看不出一个异常不能在内部产生(抛出)另一个异常的任何原因——此时它仍然是常规代码执行。但是,在您引用的讨论中,人们正在考虑 __destruct 选项,您的能力有限,因为此时执行正在终止,您可能(我不确定您是否会)有限制,例如无法创建新对象(例如new Zend_Mail())。但是,析构函数选项的优点是允许在执行前暂停/修改,而​​在这里您无法阻止电子邮件的发送
    • 我采用了与此非常相似的方法。唯一的区别是我将邮件对象的创建放在一个单独的函数中,以便有一个更简洁的构造函数,并且对于我想要邮寄的错误和我不想要邮寄的错误有更大的灵活性。感谢您的反馈!
    猜你喜欢
    • 2022-11-20
    • 2011-01-05
    • 2012-08-18
    • 2020-02-26
    • 1970-01-01
    • 2019-01-21
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多