2016-04-12 13 views
3

私は例外に取り組んでおり、例外リスナーを作成しようとしています。そこでは、データベースに関連する例外がログに記録され、電子メールで送信されます。Symfony3:集中型例外処理

しかし、問題は、私のようにユーザーにメッセージを表示するためにスローされた例外をキャッチしたときに、リスナーが呼び出されていないということです。エラーがレンダリングされていないときと同じリスナーが呼び出され

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(); 
} 

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!!'); 
} 

例外リスナー

class ExceptionListener { 

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

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

      ... 
      ... 
     } 
} 

私がしたいことは、エラーを適切かつ一箇所で管理することです。ありがとう。

+1

ところであなたはすでに[エラーを電子メールに設定モノローグ](http://symfony.com/doc/current/cookbook/logging/monolog_email.html)を参照してくださいがありますか? – Matteo

+1

はい、それを実装する可能性があります。ありがとうございました。 – codeit

答えて

1

私は実際にカーネルイベントを見落としました。例外がスローされると、HttpKernelクラスは例外をキャッチしてkernel.exceptionイベントを送出します。 例外は、キャッチされていない例外が残った場合にのみ発生します

EXCEPTIONイベントは、キャッチされない例外が表示されたときに発生します。

このイベントを使用すると、スローされた例外またはスローされた例外を修正する の応答を作成できます。イベントリスナメソッドは、 Symfony \ Component \ HttpKernel \ Event \ GetResponseForExceptionEvent インスタンスを受け取ります。

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