我正在从 php 中的普通 mysql 切换到 PDO,并且我注意到测试错误的常见方法是使用 try / catch 组合而不是 if / else 组合。

该方法的优点是什么?我可以使用一个 try / catch 块而不是多个嵌套的 if / else 块来处理不同步骤(连接、准备、执行等)的所有错误吗?

有帮助吗?

解决方案

我会用try / catch块时,通过代码的正常路径应该没有错误,除非有真正的一些特殊国情出发 - 如服务器关闭,您的凭据被过期或不正确的。我不一定会使用它来处理非特殊错误 - 说像当前用户在正确的角色不是。也就是说,当您可以合理预期和处理错误,是不是一个特殊的情况,我认为你应该做你的支票。

在您所描述的情况 - 建立和执行查询,一个try / catch块来处理它,你通常希望查询成功的好方法。在另一方面,你可能会想检查结果的内容,你期望与控制流逻辑,而不是仅仅试图使用可能无效你的目的是什么数据。

这是要寻找出有一件事是草率使用try / catch语句的。 try / catch语句不应该被用来保护自己从坏的编程 - 在“我不知道如果我这样做,所以我打算把它包在一个try / catch和最好的希望会发生什么”之类的编程。通常你想限制你抓住那些不相关的代码本身(服务器关闭,坏证书等)的各种异常情况,以便您可以查找并修复是相关的代码(空指针等错误)。

其他提示

在一般情况下,的try-catch块是伟大的,因为他们将打破(移动到catch语句)每当发生异常。如果-else块靠你预测何时会发生错误。

编辑: 此外,catch块将不会从暂停时的错误被击中停止你的代码。

try/catch 和一般异常的优点更适合人们 发展 像 PDO 这样的库。它们允许系统开发人员以快速、简单的方式处理未定义的情况或意外结果。建立数据库连接。什么 应该 如果无法访问数据库,系统会执行此操作。是否应该停止执行?再试一次?发出警告并继续?系统开发人员无法知道您需要它做什么,他们会抛出异常,您稍后将捕获并处理该异常。

作为系统的使用者,对您来说的优势在于,您不会得到一些模糊的错误代码,或者失败的简单布尔值 false,而是会得到一个 Exception 对象,它将

  1. 以这样的方式命名,以便更明显地看出出了什么问题(如果我没记错的话,PDO 只有一种异常类型,但其他系统针对不同类型的错误包含多种异常类型)

  2. 可能/应该包含可以帮助您弄清楚的方法和属性 为什么 抛出异常

无论如何,这就是理论。有很多聪明人声称例外是正确的出路。也有很多聪明人认为异常是魔鬼,是懒惰的系统开发人员的拐杖。在这个问题上没有任何类似的共识。

的try / catch完全分离误差从物体业务逻辑处理逻辑。

抛出和捕获一个例外是昂贵的操作与大多数其它任何原始操作相比。如果这是一段代码,需要有良好表现(例如,在一个紧密的循环),你会想看看你的使用情况 - 如果您希望将相对频繁抛出的异常,你会用,如果更好/其他perforance明智的(除非底层代码只是包装你的一个例外,在这种情况下,有没有收益可言)。如果异常在极少数情况下只抛出,那么你用一个try / catch最好避免在紧密循环分支的开销。

@Perchik:

我的错误处理一般理念:

您的的使用if / else语句来处理你所期望的所有情况。你应该的的使用尝试{}赶上{}处理的所有的(在大多数情况下),因为一个有用的异常可能会被提出,你可以了解一个bug从存在它。您的应该的使用尝试{}赶上{}在你怀疑的东西能/会出问题,你不希望它搞垮整个系统,如网络超时/文件系统访问问题的情况下,文件不存在,等等。

伤脑筋的例外

这正是优势,使用一个try / catch语句,而不是多个if语句。您还可以捕捉任何意外的错误。

由于PDO使用对象,它们如果发生一个错误引发异常。老在MySQL / MySQLi是单纯的功能,并没有抛出异常,他们只是返回的错误代码。尝试/异常时可以从代码中抛出抓时,你抓住它的追赶条款,这是一种面向对象的方式来处理错误英寸你抓不到用的if / else块例外 - 他们分享什么用的try / catch

其他人都有很好的答案 - 但我想我会提出自己的答案:

  1. Try/Catch 是一种实际的异常处理机制 - 因此,如果您更改异常,它将自动对所有 try/catch 语句起作用。
  2. 即使在可能杀死 if/else 的重大异常的情况下,Try/Catch 也提供了运行代码的机会,此外,try 语句可以回滚(如果您很聪明)。

在通过使用尝试捕捉用的传承PHP中,我们可以从另一个类抛出异常。

实施例: - 我在controller并通过使用Models验证用户数据

如果任何错误触发,我必须从Model方法抛出异常。

在尝试执行将打破和钓到在Catch块。

所以返回布尔瓦莱斯和检查的开销更低。

除了这个Try Catch工作很大当使用链(Try - Catch另一个Try - Catch内侧)。

与@Jared代克完全同意

通常的异常处理与用户了解很少或一无所知完成。在另一方面,该系统的用户知道的if-else语句块里面发生了什么。

例如。它应该是一个“其他”条款,显示了一个ATM的用户,消息“没有足够的银行存款余额”时,他的余额不足。而这个消息不能被坐在“catch”块内以任何理由!

比方说,我们正在写一个A / B区划代码和最有名的例外情况发生,即0除法错误,你认为有什么可以接下来做什么?  1.您可以打印消息并退出。  2.可以打印的消息,并让用户重新输入值等。

有情况下,当不同的人/供应商希望在处理不同的方式同样的异常情况。在的块让他们轻松地做到这一点。如果你需要改变的方式如何在一定的例外情况下将被处理,你只需要改变catch块。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top