2011-04-16 81 views
24

這是我的刪除操作的路由處理程序。只要項目沒有任何關聯,它就可以很好地工作。Symfony2控制器不會發生異常

public function projectDeleteAction() 
{ 
    try { 
     $request = $this->get('request'); 
     $my_id = $request->query->get('id'); 

     $em = $this->get('doctrine.orm.entity_manager'); 

     $item = $em->find('MyBundle:Main', $my_id); 

     $em->remove($item); 
     $em->flush(); 

     $info = $item->getName(); 
     $result = 0; 
    } 
    catch (Exception $e) { 
     $info = toString($e); 
     $result = -1; 
    } 

    return $this->render('MyBundle:Main:response.xml.twig', 
      array('info' => $info, 'result' => $result)); 
} 

我已經解決了試圖用關聯刪除項目的錯誤,但通過這個過程,「flush」拋出了PDOException。我嘗試了各種方法來捕捉它,但它似乎被Symfony2內部捕獲,然後它響應一個HTTP 500錯誤。有沒有一種方法可以讓Symfony2不抓住這個,以便我可以處理它?這是使用AJAX的XML響應,所以我寧願只發送一個錯誤代碼。

回答

76

嘗試更改Exception\Exception如果您在使用說明中沒有將PDOException指定爲Exception。 PHP試圖找到\YourNamespaceWithController\Exception而不是\Exception

+1

謝謝!就是這樣。 – sleeves 2011-04-18 11:41:33

+0

我也是,感謝它! – 2015-10-13 17:30:14

8

最好趕上你真正想要捕捉的異常。在這個例子中,可能是Doctrine/DBAL/DBALException和/或Doctrine/DBA/DBAException。

因此

catch (Doctrine\DBAL\DBALException $e) { 
    $result = -1; 
}; 

我會電子書籍做這樣的事情:

} catch (\Exception $e) { 
     switch (get_class($e)) { 
      case 'Doctrine\DBAL\DBALException': 
       echo "DBAL Exception<br />"; 
       break; 
      case 'Doctrine\DBA\DBAException': 
       echo "DBA Exception<br />"; 
       break; 
      default: 
       throw $e; 
       break; 
     } 
    } 

這實際上捕獲DB異常,如果由於某種原因,一些其他異常occures,這個被重新拋出回Symfony2的。

1

我不得不做下面這可能有助於一些用戶;

try{ 
    $this->doctrine->em->persist($user); 
    $this->doctrine->em->flush(); 
}catch(Exception $e){ 
    if($e->getPrevious()->getCode() == 23505){ 
     //handle duplicate error, 23505 is for postgres, 23000 is mysql unique constraint.  
    } 
}