在Symfony2中捕获数据库异常

I've got a random problem that I can't narrow down. Occasionally, I will get the following error in a Symfony2 application:

Uncaught Exception: An exception occured in driver: SQLSTATE[08004] [1040] Too many connections {"type":1,"file":"/var/www/symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php","line":115,"level":30709

I would like to setup an application-wide listener to catch the PDOException and log some information. How can I hook into Symfony to only catch PDOException?

You need to create custom exception listener. It will listen to all exceptions, but you will specify type check inside it.

In your services.yml you need to specify listener:

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

Now you need to create this class:

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
          }
     }
}

Check doc how to create event listener

Define a service like this:

<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>

And a class like this:

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