2013-06-11 24 views
0

MySQL的錯誤,我想知道什麼是處理來自Symfony的應用MySQL的例外是最好的方法,少說例如這從一個正常的環境(不是DEV):處理來自Symfony的應用

糟糕!發生錯誤服務器返回「500內部服務器 錯誤」。

其轉化爲_dev如下:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '343434' for key 'rut' 

如何處理你用這種錯誤的,以顯示一個消息給最終用戶或一些更友好?

+0

您使用的是ORM嗎? – meijuh

+0

@meijuh是的,Symfony自帶的學說 – Reynier

+0

好教條是拋出一個異常,所以你可以嘗試/捕捉它在你的控制器。請記住,你真的想盡快意識到這種類型的錯誤(就像在你的例子中,缺少一個測試或者你的數據庫模式是不正確的)。您需要的幾件事:1.定製500錯誤頁面; 2.設置電子郵件通知,以便您知道何時發生500; 3.您還可以爲原則例外添加額外的嘗試/捕獲,但請記住記錄或通過電子郵件發送,以便您瞭解它。 –

回答

2

最好的辦法是製作一個自定義錯誤頁面,並可選擇創建一個自定義錯誤處理程序來提醒您錯誤。

首先,創建一個自定義錯誤頁面,只需在/path/to/project/config/error/error.html.php中創建一個文件即可。 Symfony會自動使用您的錯誤頁面,而不是自己的錯誤頁面(如果存在)。

如果您想要更高級一點,您可以添加一個事件偵聽器來處理未捕獲的異常。要做到這一點,編輯/path/to/project/config/ProjectConfiguration.class.php並添加一個監聽器,如下:

class ProjectConfiguration extends sfProjectConfiguration 
{ 
    public function setup() 
    { 
    //... 
    $this->dispatcher->connect('application.throw_exception', array($this, 'listenToException')); 
    } 

    public function listenToException(sfEvent $event) 
    { 
    $handler = new myExceptionHandler($event); 
    $handler->doSomethingHere(); 
    } 
} 

然後,所有你需要做的就是創建自己的myExceptionHandler類節選的sfEvent $event參數。你可以在這裏做任何你想做的事情,我更願意發郵件給自己告訴我發生了錯誤。

下面是一個簡單的例子:

class myExceptionHandler 
{ 
    protected $event; 

    public function __construct(sfEvent $event) 
    { 
    $this->event = $event; 
    } 

    protected function getMailer() 
    { 
    return sfContext::getInstance()->getMailer(); 
    } 

    public function notify() 
    { 
    $subject = 'Uncaught Exception'; 
    $body = $this->event->getSubject(); 

    $mailer = $this->getMailer(); 
    $mailer->composeAndSend('[email protected]', '[email protected]', $subject, $body); 
    } 
} 

在這個例子中,你只需撥打$handler->notify()從項目配置,它會向您發送電子郵件的堆棧跟蹤。您還可以包括其他信息,如$_SERVER變量等...