由于某种原因,我无法在种子或迁移类中捕获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。