【问题标题】:Cannot catch PDOException in laravel 3无法在 laravel 3 中捕获 PDOException
【发布时间】: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 时应该得到的通用异常...

标签: php mysql laravel laravel-3


【解决方案1】:

模型实际上不会抛出 PDOException,它会在内部被捕获,而会抛出 \Illuminate\Database\QueryException,尝试捕获它。

【讨论】:

  • 这也没有被抓住。为了清楚起见,我只是在上面的代码中将\PDOException 替换为QueryException,而常规的Exception 就是被捕获的全部内容。
  • 如果你的代码是命名空间的,你需要提供完全限定的命名空间,否则它永远不会被捕获。
  • 我的代码没有名称间隔,我只是复制了显示示例的示例。我只有一个该类/方法的实例。因此,问题仍然存在......
  • 难道不是全局命名空间中的catch (\Illuminate\Database\QueryException $queryException)(显然是哪个OP)?话虽如此,QueryException 还是扩展了PDOException
  • Illuminate 与 Laravel 3 无关!
猜你喜欢
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2019-05-27
  • 2012-06-09
相关资源
最近更新 更多