PDO try-catch和exception属性

时间:2011-12-29 02:45:06

标签: exception-handling pdo

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

考虑exception handling strategies

是有帮助的
  • 通过修复某些内容并再次尝试失败的操作来重试
  • 通过重新启动操作重试
  • 继续进行该过程并稍后重试该操作(不要只是继续并忽略该异常)
  • 向更高级别抛出异常(可能是同一个异常)
  • 通过向用户显示错误消息进行重试,让他们有机会修复某些内容(如果是)重试失败的操作
  • 向用户显示错误消息并结束(输出HTML时仅don't use or die;无效的HTML不正常)。

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

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