2014-09-18 50 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