2014-09-18 3 views
1

Я только хочу обрабатывать определенные коды исключений для запроса. Остальное я хочу отпустить; так что я получаю регулярную отладку или Упс, что-то пошло не так screen, в зависимости от моей среды.Ловля только определенных кодов исключений (запроса) в 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){}); 
    } 
}); 

Update, здесь было решение, которое я в конечном итоге на основе ответа ЯРЕК 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' делает ничего. –

+0

Но, похоже, он работает так, как я предполагаю, коды исключений, отличные от 23000, дают сообщение об ошибке отладки. Это потому, что я ничего не возвращаю? –

+1

Да, работает как и ожидалось. Howeveer 'else' делает это: зарегистрируйте пустой обработчик ошибок, пока вы уже находитесь в обработчике ошибок. Эта часть не «перебрасывает» ошибку, как вы просили в заголовке q, вот и все. –

ответ

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

Спасибо, что расчистили это для меня, а также показывая мне, как правильно отбрасывать исключения :) –

Смежные вопросы