2015-04-19 44 views
1

我有一个随机问题,我无法缩小范围。偶尔,我会得到下面的错误在Symfony2中的应用:在Symfony2中捕获数据库异常

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

我想建立一个应用程序广泛收听PDOException并记录一些信息。我如何才能钩入Symfony才能赶上PDOException

+0

这是非常有帮助,谢谢。 –

+0

这就是事实。你的错误说太多的连接,必须在mysql服务器端配置。 –

+0

如果您已阅读我的问题,您可以看到我正在尝试设置侦听器来调试问题,以便我可以修复服务器。它已经被配置为接受400个连接,所以发生了一些事情导致它锁定,这就是为什么我问这个问题。你的回答确实没有帮助。 –

回答

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

检查文档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> 

和A类是这样的:

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