10

我不知道为什么我没有在我的控制器中从 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 捕获某些异常或某些控制器?

4

2 回答 2

3

当您这样做$this->container->get("mailer")->send($email);时,如果您打开了假脱机,则不会发送电子邮件。请参阅http://symfony.com/doc/current/cookbook/email/spool.html

If you have the default setting of spool: { type: memory }, the \Swift_TransportException will be thrown during the kernel termination phase, after your controller has exited. One way around this is to turn off the spooling (but then your users might have to wait while the email is sent), or you can make your own eventlistener to handle the exception. http://symfony.com/doc/current/cookbook/service_container/event_listener.html

于 2014-10-11T22:01:31.950 回答
0

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

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

然后,您创建一个扩展的异常类:

Symfony\Bundle\TwigBundle\Controller\ExceptionController

读取该文件的源代码,然后重写方法以在 Exception 类型为 Swift_TransportException 时切换渲染哪个模板

您可以通过在 showAction() 中设置类变量并将其传递给 findTemplate() 来做到这一点

显示动作:

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

查找模板:

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

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

有关更多信息,我推荐 KNPUniversity Symfony Screencasts。

于 2012-08-16T16:53:31.753 回答