不能在种子或迁移类中捕获数据库异常


Laravel 4 - Cannot catch database exception in seed or migration class

由于某种原因,我无法在种子或迁移类中捕获DB异常(Illuminate'Database'QueryException):代码从未进入捕获块。

例如,如果我尝试在列'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错误:等",但没有发出警告(正确)

任何想法?谢谢你的帮助。

你必须捕获"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有关,它只发生在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(不是一个好的解决方案),一切都运行正常,并且在迁移/种子中,我可以捕获queryexception。