visual try tipos sirve qué para excepciones errores ejemplos ejemplo como catch capturar php symfony swiftmailer

php - tipos - try catch java



swiftmailer Swift_TransportException no queda atrapado por el bloque try-catch (6)

Para un proyecto (que se trata de propiedades inmobiliarias), he incluido un formulario de contacto donde un visitante puede contactar a un agente inmobiliario si el visitante está interesado en comprar / alquilar una propiedad inmobiliaria.

Estoy usando Symfony2 y su biblioteca. Para el correo de contacto, estoy usando la biblioteca Swiftmailer. Bueno, tengo el siguiente código que maneja el formulario enviado. allí, creo un objeto de correo para poder enviar correos. Funciona, pero quiero proporcionar un servicio de resolución de errores si hay problemas con el host smtp del remitente / receptor.

Aquí está el código,

$data = $contactForm->getData(); try { // create body text $body = $app[''twig'']->render(''mailTemplate.twig'', array(''data'' => $data, ''immoid'' => $immoID)); // set mail $mail = /Swift_Message::newInstance() ->setSubject(''Contact reaction on your immo offer.'') ->setFrom($app[''swiftconfig''][''sender'']) ->setTo($contactinfo[''contactmail'']) ->setBody($body, ''text/html''); // send mail $app[''mailer'']->send($mail); // redirect if successfull $app->redirect($app[''url_generator'']->generate(''immoDetail'', array(''immoID'' => $immoID))); } catch (Swift_TransportException $STe) { // logging error $string = date("Y-m-d H:i:s") . '' - '' . $STe->getMessage() . PHP_EOL; file_put_contents("errorlog.txt", $string, FILE_APPEND); // send error note to user $errorMsg = "the mail service has encountered a problem. Please retry later or contact the site admin."; } catch (Exception $e) { // logging error $string = date("Y-m-d H:i:s") . '' - GENERAL ERROR - '' . $e->getMessage() . PHP_EOL; file_put_contents("errorlog.txt", $string, FILE_APPEND); // redirect to error page $app->abort(500, "Oops, something went seriously wrong. Please retry later !"); }

($ app [''swiftconfig''] [''sender''] = mailaddress del host / $ contactinfo [''contactmail''] = mailaddress del visitante del sitio (enviado en formulario de contacto))

Ahora, cuando el host smtp no funciona, Swiftmailer envía una excepción, pero el bloque try-catch NO lo está captando. La función simplemente continúa. Incluso el bloque try-catch raíz (en app.php) tampoco lo está captando. Como resultado de esto, verá un gran error de PHP en la página web, que no debería ocurrir. El mensaje de esto se describe a continuación,

SCREAM: Error suppression ignored for --- Fatal error: Uncaught exception ''Swift_TransportException'' with message '' in C:/.../vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php on line 266 --- Swift_TransportException: Connection could not be established with host <output omitted>

¿Alguien sabe por qué el bloque try catch no capta la excepción personalizada? Investigué los archivos de clase y el progreso, pero no veo ninguna actividad inusual.

Espero que alguien pueda venir con una solución a esto porque los errores de PHP no deberían aparecer en las páginas del sitio.


eliminar de su config.yml spool: { type: memory }

Entonces deberás agregar try catch como este

try{ $mailer = $this->getMailer(); $response = $this->getMailer()->send($message); }catch(/Swift_TransportException $e){ $response = $e->getMessage() ; }



SCREAM es una configuración de XDebug que permite ver los errores que normalmente son capturados o suprimidos. (Usando @, por ejemplo.) Buscar

xdebug.scream = 1

en tu php.ini y configúralo en 0.


Cuando haces $app[''mailer'']->send($mail); el mensaje de correo electrónico no se envía en ese momento si tiene activado el spooling. Ver http://symfony.com/doc/current/cookbook/email/spool.html

Si tiene la configuración predeterminada de spool: { type: memory } , se /Swift_TransportException la /Swift_TransportException durante la fase de finalización del kernel, después de que su controlador haya salido. Una forma de evitar esto es desactivar el spooling (pero es posible que los usuarios tengan que esperar mientras se envía el correo electrónico), o puede hacer que su propio eventlistener maneje la excepción. http://symfony.com/doc/current/cookbook/service_container/event_listener.html


Me encontré con este problema en Laravel 4.2 cuando agregué un SwiftMailerHandler a Monolog para que me enviara por correo electrónico cualquier cosa registrada en un nivel determinado o superior. No había forma de que detectara la excepción en el controlador y se devolvió al navegador. Lo resolví subclasificando SwiftMailerHandler:

<?php /******************************************************************************* * $Id: LogMailer.php 12152 2015-09-15 00:42:38Z sthames $ */ /** * Subclass of Monolog SwiftMailerHandler that will catch exceptions SwiftMailer * throws during the send. These exceptions are logged at the critical level. * Without this, such exceptions are reported back to the browswer. *******************************************************************************/ class LogMailer extends /Monolog/Handler/SwiftMailerHandler { /** Flag set when logging an exception during send. */ protected $dont_mail = false; /** Overloads sender to catch and log errors during the send. */ protected function send($content, array $records) { try { if (!$this->dont_mail) parent::send($content, $records); } catch(/Exception $e) { $this->dont_mail = true; Log::critical($e->getMessage()); $this->dont_mail = false; } } }

Este controlador detecta la excepción de SwiftMailer y la registra en el nivel crítico para que no se pierda. No recibo un correo electrónico al respecto, pero al menos está en el registro.

Me sorprendió descubrir que SwiftMailerHandler no ofrecía ninguna forma de insertar un manejador de excepciones en el método de envío, pero afortunadamente el código está escrito lo suficientemente bien como para simplificar esta solución.

Funciona muy bien y no me ha dado ningún problema hasta ahora.


puedes probar el siguiente código para el error personalizado:

public function render($request, Exception $exception) { if ($exception instanceof /Swift_TransportException) { return response()->view(''errors.404''); } return parent::render($request, $exception); }