2014-09-18 51 views
1

我只想處理某些查詢異常代碼。剩下的我想放手;這樣我才能得到正常的調試或哎呀,出錯了屏幕,這取決於我的環境。在Laravel中僅捕獲某些(查詢)異常代碼

我目前在我的routes.php文件中有下面的代碼,它似乎工作。但這是否是正確的做法?

// Query Exceptions 
App::error(function(QueryException $exception) 
{ 
    $allowedCodes = array(
     '23000',   // Integrity constraint violation 
    ); 

    if (in_array($exception->getCode(), $allowedCodes)) 
    { 
     return Response::view('errors.show', array('code' => 'query_error_' . $exception->getCode())); 
    } 
    else 
    { 
     App::error(function(QueryException $exception){}); 
    } 
}); 

更新,這裏是我結束了基於亞雷克Tkaczyk的答案的解決方案:

App::error(function(QueryException $exception) 
{ 
    $allowedCodes = array(
     '23000',   // Integrity constraint violation 
    ); 

    if (in_array($exception->getCode(), $allowedCodes) && !App::environment('local')) 
    { 
     Log::warning('QueryException', array('context' => $exception->getMessage())); 
     return Response::view('errors.show', array('code' => 'query_error_' . $exception->getCode())); 
    } 
}); 
+0

你'else'什麼都不做。 – 2014-09-19 09:58:27

+0

但它似乎按照我的意圖工作,除23000以外的異常代碼給出調試異常消息。那是因爲我什麼都沒有回來? – 2014-09-19 10:02:17

+1

是的,它按預期工作。 Howeveer'else'這樣做:註冊空的錯誤處理程序,而您已經在錯誤處理程序中。這件作品不會像「q」標題中提到的那樣「重新拋出」錯誤,就這些。 – 2014-09-19 10:10:38

回答

3

您的當前代碼是唯一例外的方法:else代碼塊基本上沒有任何作用 - 它爲正在處理的異常註冊另一個處理程序。

這裏的東西,使之更加明確:

App::error(function(QueryException $exception) 
{ 
    $allowedCodes = array(
     '23000',   // Integrity constraint violation 
    ); 

    if (in_array($exception->getCode(), $allowedCodes)) 
    { 
     return Response::view('errors.show', array('code' => 'query_error_' . $exception->getCode())); 
    } 

    // no need for else, it will handle exception like usually - depending on the debug config 
}); 

,或者你可以重新拋出異常,並做幾乎一樣:

App::error(function(QueryException $exception) 
{ 
    $allowedCodes = array(
     '23000',   // Integrity constraint violation 
    ); 

    if (in_array($exception->getCode(), $allowedCodes)) 
    { 
     return Response::view('errors.show', array('code' => 'query_error_' . $exception->getCode())); 
    } 
    else 
    { 
     throw $exception; // this will show plain exception 

     // or display whoops pretty handler: 
     App::getFacadeApplication()->{'exception.debug'}->display($exception); 

    } 
}); 
+0

謝謝你爲我清理那些東西,並且告訴我如何正確拋出異常:) – 2014-09-19 20:28:52