2011-12-29 104 views
0

我正在使用PDO连接到mysql数据库。我很困惑,我应该在哪里使用try catch块,如果我设置错误属性像这样: $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);PDO try-catch和异常属性

现在我有我的连接信息(用户名,密码等)和上面的行在单独文件,我将包括在我的主要文件中。这些(连接信息和上面的行)存储在try-catch块中。

在我的主要文件中,我包含这个文件。我是否也需要在我的主文件中使用try-catch块(在pdo相关的东西周围)? (他们是我创建和执行查询的地方)。

+0

考虑选择[有意义的用户名](http://tinyurl.com/so-hints)。这样做的一个好处是其他人可以使用[at-replies](http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work),你会得到一个有人向你发出的通知在评论中。 – outis 2011-12-29 03:08:41

回答

1

与所有例外情况一样,只要不处理它们,并且在处理它们时有意义,就需要处理它们。对于每一种可能抛出的方法,问问你自己在哪里可以正确处理?当可能抛出它们的PDO函数被调用时,但在更高层次上捕获异常是没有意义的。 (例如,在创建新的PDO对象时处理PDOException是没有意义的,因为后面的代码将取决于具有有效的PDO对象;相反,它必须在可以尝试从异常中恢复或正常失败)。这是异常的原因:可能会在较低的级别检测到错误,但可能没有足够的信息来处理错误。所以,代码会抛出一个异常到更高的地方来处理错误。

在一个设计良好的项目中,数据存储访问被隔离为一个模块,因此其余大部分代码不受数据存储的确切性质影响。在具有这种分离的体系结构(如多层或MVC)中,数据存储异常将在数据访问层中处理,但“处理”可能意味着抛出不同类型的异常。

它有助于思考exception handling strategies

  • 重试通过固定的东西,通过重新启动的操作
  • 继续与进程尝试失败的操作再次
  • 重试和试操作在以后时间(不要只是继续,忽略例外)
  • 向更高级别抛出异常(可能是相同的例外)
  • 重试向用户显示错误消息,给他们一个修复某些东西的机会(如果是的话)重试失败的操作
  • 向用户显示一条错误消息并结束(输出HTML时只有don't use or die;无效的HTML不是优雅的)。

另请参阅:“Exception-handling antipatterns”。

如果您问是否将错误模式设置为PDO::ERRMODE_EXCEPTION会导致异常被捕获,事实上恰恰相反。只有catch块可以处理异常。

+0

谢谢,由于我使用PDO setAttribute功能,我对try-catch块是否多余感到困惑 – user1114 2011-12-29 02:57:24

+0

如果答案似乎无法解决您的问题,请编辑您的问题以澄清它。 SO是一个问答网站,而不是论坛。它运行于[写得很好的问题](http://sscce.org/)。评论并不意味着讨论;它们适用于诸如澄清请求,简短注释等。 – outis 2011-12-29 03:10:02