首页 文章

在Symfony2中捕获数据库异常

提问于
浏览
1

我有一个随机的问题,我无法缩小范围 . 偶尔,我会在Symfony2应用程序中收到以下错误:

未捕获的异常:驱动程序中发生异常:SQLSTATE [1040]连接太多{“type”:1,“file”:“/ var / www / symfony / vendor / doctrine / dbal / lib / Doctrine / DBAL /Driver/AbstractMySQLDriver.php","line":115,"level":30709

我想设置一个应用程序范围的侦听器来捕获 PDOException 并记录一些信息 . 我如何挂钩到Symfony才能捕获 PDOException

2 回答

  • 8

    您需要创建自定义异常侦听器 . 它将侦听所有异常,但您将在其中指定类型检查 .

    services.yml 中,您需要指定监听器:

    kernel.listener.your_pdo_listener:
            class: Acme\AppBundle\EventListener\YourExceptionListener
            tags:
               - { name: kernel.event_listener, event: kernel.exception, method: onPdoException }
    

    现在您需要创建此类:

    YourExceptionListener

    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
    class YourExceptionListener
    {
         public function onPdoException(GetResponseForExceptionEvent $event)
         {
              $exception = $event->getException();
    
              if ($exception instanceof PDOException) {
                  //now you can do whatever you want with this exception
              }
         }
    }
    

    检查doc how to create event listener

  • 2

    定义这样的服务:

    <service id="app.listener.kernel.exception"
                     class="MyAppBundle\Listener\KernelExceptionListener">
                <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException"/>
                <argument type="service" id="logger"/>
    </service>
    

    还有这样一个类:

    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
    
    class KernelExceptionListener
    {
        private $logger;
    
        public function __construct(Monolog\Logger $logger)
        {
            $this->logger = $logger;
        }
    
        public function onKernelException(GetResponseForExceptionEvent $event)
        {
            // Here check the exception
            //$event->getException()
        }
    }
    

相关问题