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
Есть идеи? Спасибо за вашу помощь.
Вы должны поймать «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.