2015-04-19 47 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() 
    } 
}