Laravel 4 - 无法在种子或迁移类中捕获数据库异常

时间:2014-03-22 10:21:04

标签: php laravel-4 try-catch

使用MySql db的Laravel 4。 出于某种原因,我无法在种子或迁移类中捕获数据库异常( Illuminate \ Database \ QueryException ):代码永远不会进入catch块。

例如,如果我尝试在“name”列为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等等,但我没有运气。
  • 我可以捕获其他类型的异常(例如,除以零等)
  • 我可以在routes.php中捕获QueryException,相同的代码运行良好:代码进入'catch',我收到消息“SQL Error:etc.”但没有提出警告(正确)

有什么想法吗? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

你必须抓住" 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");
}

答案 1 :(得分:1)

感谢php exceeds execution time on throwing an exception in recursion我终于理解了这个问题。

显然它与XDebug有关,它只出现在Mac OS X上的PHP上(我在Windows上尝试了几个PHP,但从未遇到过这个问题),并且仅在通过CLI运行迁移或种子时(例如php artisan db:seed --class = className)。

它与这些XDebug设置有关:

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

我不知道为什么,但这导致QueryException永远不会被捕获,PHP向我展示了整个异常堆栈。

如果我评论这些选项,或者将它们设置为更合适的值(例如10)或者如果我禁用XDebug(不是一个好的解决方案),一切都运行正常,并且在迁移/种子内我可以捕获QueryExceptions。