异常处理总是很昂贵吗?

时间:2014-02-08 06:31:08

标签: python exception exception-handling

我一次又一次地被告知,对于像确定类型这样的操作的异常处理是不好的形式,因为异常总是计算成本很高。尽管如此,我已经看过帖子(特别是与Python相关的帖子,例如this one的回复),建议使用异常处理来实现这个目的。

我想知道,如果要普遍避免抛出和捕获异常,因为它总是计算成本很高,或者某些语言​​(如Python)是否更好地处理异常,并允许更自由地使用异常处理。

3 个答案:

答案 0 :(得分:6)

对于所有编程语言,您都不能提供一般性建议,例如“异常是昂贵的,因此应该避免”。

正如您所怀疑的那样,在Python中,异常的使用比C ++等其他语言更为宽松。 Python不是原始性能,而是强调代码可读性。有一个成语“请求宽恕比允许更容易”,这意味着:只是尝试你想要实现的东西并捕获异常比先检查兼容性更容易。

容错:

try:
    do_something_with(dict["key"])
except (KeyError, TypeError):
    # Oh well, there is no "key" in dict, or it has the wrong type

许可:

if hasattr(dict, "__getitem__") and "key" in dict:
    do_something_with(dict["key"])
else:
    # Oh well

实际上,在Python中,带有for循环的迭代实现时有异常:迭代在到达结束时引发StopIteration异常。所以即使你试图避免例外,你也会一直使用它们。

答案 1 :(得分:2)

我认为很多都归结为具体的用例。

在你发布的例子中,海报明确提到了Python的“鸭子打字”方面。本质上,您使用生成的异常来确定变量是否具有特定功能或功能集而不是手动检查(因为Python允许大量动态操作,类可能通过__getattr__访问“拆分”,这使得无法使用标准if语句进行检查,因此您尝试使用split,然后如果无法执行,我们将继续计划B)。

在许多Python应用程序中,我们也不会过多担心其他应用程序中可能存在的某些性能细节,因此异常的任何开销都是“微不足道的”。

答案 2 :(得分:0)

在对我的模块tco进行编码时,我遇到了这个问题。在版本1.0.1alpha中,我实现了同一类的三个版本。该模块用于计算目的;因此,我想我可以回答你的问题。

通过将快速操作嵌入到使用而不使用异常的类中来计算快速操作的速度是使用 异常的两个类的两倍。但是你必须知道,如果你认为在异常之间计算有趣的东西会使差异变得非常小,那么这样的测试可能毫无意义。 没有人会真正关心空循环和空系统之间的时间差异,从而引发和捕获异常!

出于这个原因,我决定在发布我的模块的1.1版本时删除第一个系统。虽然速度稍慢,但我发现依赖异常的系统更加强大,我专注于它。

相关问题