在Symfony2 dev env控制器中捕获swiftmailer异常

时间:2012-07-15 21:36:14

标签: symfony swiftmailer

我不知道为什么我没有在我的控制器中捕获Swiftmailer的异常。我做错了什么,或者错过了什么?

在控制器中我有:

try {
    $this->get('mailer')->send($email);
}
catch (\Swift_TransportException $e) {
    $result = array(
        false, 
        'There was a problem sending email: ' . $e->getMessage()
    );
}

在它到达我的代码之前似乎被Symfony抓住了,所以我自己得到标准的500页而不是自己处理错误 Swift_TransportException: Connection could not be established

如果无法发送电子邮件,则无需停止申请,因为电子邮件并不重要 - 我只是想发出通知。

也许有办法禁用Symfonys捕获某些异常或某些控制器?

2 个答案:

答案 0 :(得分:3)

执行$this->container->get("mailer")->send($email);时,如果您已打开假脱机,则此时不会发送电子邮件。见http://symfony.com/doc/current/cookbook/email/spool.html

如果您的默认设置为spool: { type: memory },则在您的控制器退出后,在内核终止阶段将抛出\Swift_TransportException。 解决此问题的一种方法是关闭假脱机(但是您的用户可能必须在发送电子邮件时等待),或者您可以创建自己的事件监视器来处理异常。 http://symfony.com/doc/current/cookbook/service_container/event_listener.html

答案 1 :(得分:0)

您可以尝试覆盖config.yml中的T​​wig异常处理程序:

twig:
    debug:            %kernel.debug%
    strict_variables: %kernel.debug%
    exception_controller: MyBundleName:Exception:show

然后创建一个扩展的Exception类:

的Symfony \捆绑\ TwigBundle \控制器\ ExceptionController

读取该文件的源代码,然后覆盖方法以切换当Exception类型为Swift_TransportException时呈现的模板

您可以通过在showAction()中设置类变量并将其传递给findTemplate()

来实现。

的showAction:

$ this-> exceptionClassName = $ exception-> getClass();

findTemplate:

if (!$debug && $this->exceptionClassName == 'MyBundle\Exception\GenericNotFoundException') {

            return 'BundleName:Exception:generic404.html.twig';
        }

有关更多信息,我建议使用KNPUniversity Symfony Screencast。