我只想处理某些查询异常代码。剩下的我想放手;所以我得到常规调试或糟糕,出现问题屏幕,具体取决于我的环境。
我目前在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){});
}
});
更新,这是我根据Jarek 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 :(得分: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);
}
});
答案 1 :(得分:0)
是的,这是正确的方法。
对于本地环境,您当然要使用环境as described in Laravel's documentation。