仅捕获Laravel中的某些(查询)异常代码

时间:2014-09-18 22:46:36

标签: laravel laravel-4 exception-handling

我只想处理某些查询异常代码。剩下的我想放手;所以我得到常规调试或糟糕,出现问题屏幕,具体取决于我的环境。

我目前在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()));
    }
});

2 个答案:

答案 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