2016-04-12 23 views
3

Özel durumlar üzerinde çalışıyorum ve veritabanıyla ilgili istisnaların günlüğe kaydedileceği ve e-posta ile gönderileceği bir istisna dinleyicisi oluşturmaya çalışıyorum.Symfony3: Merkezi özel durum işleme

Ama sorun istisnayı yakalamak zaman dinleyici olarak kullanıcıya mesaj göstermek için çağrılmaz şudur:

try { 
    try { 
     $em = $this->getDoctrine()->getManager(); 

     $user = $em->getRepository('AppBundle:User') 
       ->getUserByEmail('[email protected]'); 

    } 
    catch(\Doctrine\DBAL\DBALException $e) { 
     throw new \Doctrine\DBAL\DBALException('DBAL error!!'); 
    } 
} 
catch(\Exception $e) { 
    echo $e->getMessage(); 
} 

hata hale değilken aynı dinleyici denir:

try { 
    $em = $this->getDoctrine()->getManager(); 

    $user = $em->getRepository('AppBundle:User') 
      ->getUserByEmail('[email protected]');  
} 
catch(\Doctrine\DBAL\DBALException $e) { 
    throw new \Doctrine\DBAL\DBALException('DBAL error!!'); 
} 

istisna dinleyici:

class ExceptionListener { 

     public function onKernelException(GetResponseForExceptionEvent $event) { 
      $exception = $event->getException(); 

      if ($exception instance of \Doctrine\DBAL\DBALException) { 
      //log the error 
      } 

      ... 
      ... 
     } 
} 

Yapmak istediğim, hataları doğru ve tek bir yerde yönetmektir. Teşekkürler.

+1

BTW zaten [Yapılandırma Monolog Hataları Email] görmesine (http://symfony.com/doc/current/cookbook/logging/monolog_email.html)? – Matteo

+1

Evet ve muhtemelen bunu uygulayacaktır. Teşekkür ederim. – codeit

cevap

1

Kernel olaylarını aslında göz ardı ettim. Bir istisna atıldığında, HttpKernel sınıfı onu yakalar ve kernel.exception olayını gönderir. Olay, yalnızca bir istisna işaretsiz bırakıldığında gerçekleşir.

EXCEPTION olayı, yakalanmamış bir istisna göründüğünde ortaya çıkar.

Bu olay, atılan özel durumu değiştirmek için atılmış bir özel durum veya için bir yanıt oluşturmanıza olanak tanır. Olay dinleyicisi yöntemi, bir Symfony \ Component \ HttpKernel \ Event \ GetResponseForExceptionEvent örneğini alır.

http://api.symfony.com/3.0/Symfony/Component/HttpKernel/KernelEvents.html