无法在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel/Lumen 中捕获 401 响应?

laravel 无法删除记录

如何解决未捕获的类型错误:无法读取未定义的属性“调用”?

Laravel 中的 Route::delete 没有捕获 Request $request

未捕获(承诺中)类型错误:无法读取未定义的属性“uid”

Laravel - 如何在刀片视图中尝试/捕获?