Laravel 4 – Не удается поймать исключение базы данных в классе семян или миграции

Laravel 4 с MySql db. По какой-то причине я не могу уловить исключения DB ( Illuminate \ Database \ QueryException ) внутри класса семян или миграции: код никогда не входит в блок catch.

Например, если я попытаюсь вставить в таблицу, где имя столбца UNIQUE:

try { $data = array('id' => 1, 'name' => 'foo'); DB::table('table')->insert($data); } catch (\Exception $e) { $this->command->error("SQL Error: " . $e->getMessage() . "\n"); } 

… Я всегда получаю эту ошибку:

 PHP Warning: Uncaught exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 
  • Я попытался поймать Exception, \ Exception, \ PDOException, \ Illuminate \ Database \ QueryException и т. Д., Но мне не повезло.
  • Я могу поймать другие типы исключений (например, деление на ноль и т. Д.)
  • Я могу поймать QueryException внутри routes.php, тот же код работает хорошо: код вводит «catch», я получаю сообщение «Ошибка SQL: и т. Д.», но предупреждение не возникает (правильно)

Есть идеи? Спасибо за вашу помощь.

Вы должны поймать «Illuminate \ Database \ QueryException»

 try { $data = array('id' => 1, 'name' => 'foo'); DB::table('table')->insert($data); } catch (\Illuminate\Database\QueryException $e) { $this->command->error("SQL Error: " . $e->getMessage() . "\n"); } 

Благодаря php превышает время выполнения при выбросе исключения в рекурсию, я, наконец, понял проблему.

По-видимому, это связано с XDebug, и это происходит только на PHP в Mac OS X (я пробовал несколько PHP в Windows, но никогда не сталкивался с этой проблемой) и только при выполнении миграции или семени по CLI (например, php artisan db: seed – -класс = имя класс).

Это связано с этими настройками XDebug:

 xdebug.var_display_max_depth = -1 xdebug.var_display_max_children = -1 xdebug.var_display_max_data = -1 

Я не знаю, почему, но это привело к тому, что QueryException никогда не попадалось, и PHP показал мне весь стек исключений.

Если я прокомментирую эти параметры или присвою их более подходящему значению (например, 10), или если я отключу XDebug (не очень хорошее решение), все будет работать нормально, а внутри миграции / семени я могу поймать QueryExceptions.