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

标签 php

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

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

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

 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 block 中,但在我看来,这违背了使用自定义异常的目的,因为此类的客户端现在必须考虑在所有 catch block 中添加邮件代码。

最佳答案

我会这样处理(我是否遗漏了一些要求?)

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() )时,都会有人收到一封电子邮件。

关于php - 如何扩展异常以发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6227843/

相关文章:

php - 将自定义日期格式字符串转换为 yyyy/mm/dd

php - 使用 MySQL 进行时间计算

php - 快速加载网页

php - 简单的 if 语句(不是速记)

php - -vf 无法被 php exec() 函数识别

php - 为什么 kohana 3 Encrypt 类 encode() 方法每次都返回不同的字符串?

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

Php from android in json 未发布到表中,我的代码有问题吗?

php - 这是一个 php 错误,还是我的时区/PHP 设置有问题?

php - 困惑为什么mysqli_query返回false