使用try {} catch {}与其他{}的优点是什么?

我正在切换从普通的MySQL在PHP到PDO,我注意到,testing错误的常见方法是使用try / catch组合而不是if / else组合。

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

当通过代码的正常path应该没有错误地进行时,我会使用try / catch块,除非有真正的一些例外情况 – 例如服务器closures,您的凭据过期或不正确。 我不一定会用它来处理非常规的错误 – 比如说当前用户没有处于正确的angular色。 也就是说,当你可以合理预期和处理一个不是特殊情况的错误时,我认为你应该做你的检查。

如果您已经描述了设置和执行查询的情况,try / catch块是一个很好的方式来处理它,因为您通常希望查询成功。 另一方面,您可能需要检查结果的内容是您期望的控制stream逻辑,而不是尝试使用可能不适合您的目的的数据。

有一件事,你要注意是try / catch的草率使用。 尝试/捕获不应该用来保护自己免受糟糕的编程 – “我不知道如果我这样做会发生什么,所以我会试着把它包起来,并希望最好的”types的编程。 通常情况下,您需要将捕获到的exceptiontypes限制为与代码本身无关的exception(服务器故障,凭据错误等),以便查找和修复与代码相关的错误(空指针等)。

一般来说,try-catch块很好,因为每当发生exception时它们都会中断(移到catch语句)。 如果其他块依靠你预测何时会发生错误。

编辑:另外,catch块不会阻止你的代码在遇到错误时停止。

try / catch和一般例外的优点更多的是像PDO这样的开发图书馆的人。 它们允许系统开发人员快速简单地处理未定义的情况或意外的结果。 采取数据库连接。 如果数据库无法到达,系统该做什么。 它应该停止执行吗? 再试一次? 抛出警告并继续? 系统开发人员无法知道你需要做什么,他们会抛出一个exception,你以后会抓住和处理。

对于你来说,作为系统的一个消费者的好处不是得到一些模糊的错误代码,或者是一个简单的布尔错误,它失败了,你会得到一个Exception对象,它将

  1. 如果我记得没错,PDO只有一个exceptiontypes,但其他系统包含多种不同types的exceptiontypes的错误)

  2. 可能/应该包含方法和属性,可以帮助您找出exception抛出的原因

无论如何这就是理论。 有很多聪明的人声称例外是要走的路。 也有很多聪明的人认为Exceptions是恶魔,对懒惰的系统开发者来说是一个拐杖。 在这个问题上没有任何共识。

Try / Catch完全将error handling逻辑从对象业务逻辑中分离出来。

这正是优点,使用一个try / catch而不是多个if语句。 您也将能够捕捉到任何意料之外的错误。

与大多数其他基本操作相比,投掷和捕捉exception是一项昂贵的操作。 如果这是一段需要良好执行的代码(例如,在一个紧密的循环中),你会想看看你的用例 – 如果你期望exception被抛出相对频繁,你会更好的与一个if /或者perforance-wise(除非底层代码只是为你包装一个例外,在这种情况下根本没有任何收益)。 如果在极less情况下抛出exception,那么最好使用try / catch来避免在严格循环中分支的开销。

由于PDO正在使用对象,如果发生错误,它们会引发exception。 旧的mysql / mysqli是单纯的函数,并没有抛出exception,他们只是返回错误代码。 当代码抛出一个exception时,可以使用try / catch,并在catch-clause中捕获它,这是一种面向对象的方式来处理错误。 你不能用if / else块捕捉exception – 它们与try / catch没有共享。

@Perchik:

我的error handling的一般理念:

应该使用if / else来处理您所期望的所有情况。 您不应该使用try {} catch {}来处理所有事情 (在大多数情况下),因为可能会引发一个有用的exception,您可以从中了解错误的存在。 在怀疑某些事情可能会出错的情况下,您应该使用try {} catch {},并且不希望它导致整个系统崩溃,如networking超时/文件系统访问问题,文件不存在等。

令人烦恼的例外

其他人都有很好的答案 – 但我想我会把自己的:

  1. Try / Catch是一个实际的exception处理机制 – 所以如果你改变你的exception,它将自动在所有的try / catch语句上工作。
  2. Try / Catch提供了运行代码的机会,即使在可能会导致if / else的主要exception的情况下,try语句也可以被回滚(如果你是精明的)。

在PHP中通过使用Try Catch来inheritance,我们可以从另一个类抛出exception。

示例: – 我在controller ,使用Modelsvalidation用户数据。

如果任何错误触发,我只需要抛出Model方法的exception。

在try中的执行将会在Catch Block中被破解并Catch

所以返回布尔值和检查的开销较less。

除此之外Try Catch工程很好当在链中使用( Try - Catch另一个Try - Catch )。

完全同意@Jared Updike

通常情况下,exception处理是由用户对此知之甚less或根本不知道的。 另一方面,系统用户知道在if-else块内发生了什么。

例如。 应该是一个“其他”条款,显示一个ATM用户,当他的余额低时,显示“银行余额不足”。 而且这个信息不能以任何理由坐在“catch”区块内!