2011-01-13 40 views
5

你什么时候使用每个?我发现我使用if比例外更多。我似乎在使用我的“ifs”来捕捉例外之前,我甚至没有得到它们。有我的代码全是ifs。什么时候应该使用“if”检查错误,以及何时应该使用异常?

+1

这已被问无数次(2739582,1152541,1313812)。在这个问题之间,你的问题4557577(毫无疑问,无数其他人)和你现在超过800个问题*,似乎你是垃圾邮件发送者的问题。 – 2011-01-13 07:01:35

回答

2

尝试catch语句旨在处理严重错误,尤其是连接到外部服务(如Web服务,数据库,Web请求等),其中错误将会随时发生。在运行时环境中处理异常比在编写好的代码和使用给定语言的特性(如ifs或三元操作)上要重要得多。

尝试捕获不是第一道防线,它们是使用防御性编码实践的最后一条线。

1

尤其是当您使用大型应用程序时,异常处理确实是一种更好的做法。正如你所提到的,你会得到很多if语句。使用python,使用try/except语句可以让你创建一个处理异常的更加标准化的方法。有了例外情况,您将看到异常类的类型以及您构建的其他自定义类的好处。它只是给你一个更加结构化的编码方式。

4

EAFP: Easier to ask for forgiveness than permission.

这是常见的Python代码风格的假设有效密钥或属性和捕获异常的存在,如果假设证明错误的。

与此相反,LBYL (Look before you leap)风格常见于许多其他语言如C

更新1

当然,你必须确保你处理任何捕获的异常,而不是只是默默地忽略它们否则你会浪费很多时间调试! pass可能不是你正在寻找的!

更新2

你应该抓住特定的例外,你是期待raise -d,无论是built-in exceptions或其他方式。

+0

我把泛型尝试:除了例外,:print e pass是那个? – TIMEX 2011-01-13 06:14:57

2

我不重复了许多人已经说过,但有使用异常的一个很大的优势,我想提一提其中:

如果一些常规失败,你可以轻松的哪个级别决定间接,你应该处理这个异常 - 你不需要在每一步之后用错误检查来膨胀更深的层次。

当然,这并不能让您摆脱责任,即拥有良好的清理代码,这将使每一个可能的执行路径都变得清晰:因此释放所有资源,套接字,提交或回滚事务等。而且有很多办法来做到这一点:

  • try... finally块,允许任何异常传播,但清洗前的一切行动(多国语言,包括Python),
  • with声明(具体到Python),
  • 涉及在析构函数中清理(主要是C++)的RAII范例。
相关问题