无法在 laravel 3 中捕获 PDOException
Posted
技术标签:
【中文标题】无法在 laravel 3 中捕获 PDOException【英文标题】:Cannot catch PDOException in laravel 3 【发布时间】:2014-06-24 23:13:03 【问题描述】:我正在尝试在 laravel 3 中捕获 PDOException,但似乎我无法做到这一点。我的代码如下:
try
DB::connection()->pdo->beginTransaction();
Myobject::create($cleaned_input_array);
// do other stuff that could possibly throw a custom exception
DB::connection()->pdo->commit();
catch(\PDOException $e)
DB::connection()->pdo->rollBack();
return HTTP_STATUS::response(BAD_REQUEST, array("error creating");
catch(Exception $e)
DB::connection()->pdo->rollBack();
return HTTP_STATUS::response(BAD_REQUEST, array($e->getMessage()));
如果 'try' 中的其他部分抛出异常,则捕获一般异常。如果他们不这样做,一切都会运行干净。如果create
在执行 mysql 语句时遇到问题,它不会抛出 PDOException,它只是抛出一般异常。
【问题讨论】:
为什么你的PDOException
前面有个\
我读到您可以在 PDOException 前面放置一个“\”来解决命名空间问题。即使我删除了“\”,我仍然无法捕捉到 PDOException。我应该注意,创建时的错误被作为一般异常抛出......
为什么不转储$e
的类型,例如get_class($e)
?这至少会告诉您在通用异常处理程序中捕获的异常类型
请扩展似乎相关的Myobject
(您希望它会抛出 PDOException!),以便人们可以轻松地重现该问题。
请移除第一个 catch 块并 var_dump 抛出 PDOException 时应该得到的通用异常...
【参考方案1】:
模型实际上不会抛出 PDOException
,它会在内部被捕获,而会抛出 \Illuminate\Database\QueryException
,尝试捕获它。
【讨论】:
这也没有被抓住。为了清楚起见,我只是在上面的代码中将\PDOException
替换为QueryException
,而常规的Exception
就是被捕获的全部内容。
如果你的代码是命名空间的,你需要提供完全限定的命名空间,否则它永远不会被捕获。
我的代码没有名称间隔,我只是复制了显示示例的示例。我只有一个该类/方法的实例。因此,问题仍然存在......
难道不是全局命名空间中的catch (\Illuminate\Database\QueryException $queryException)
(显然是哪个OP)?话虽如此,QueryException
还是扩展了PDOException
Illuminate
与 Laravel 3 无关!以上是关于无法在 laravel 3 中捕获 PDOException的主要内容,如果未能解决你的问题,请参考以下文章