【问题标题】:How to prompt programmers to use try except clause in python?python中如何提示程序员使用try except子句?
【发布时间】:2015-07-23 09:54:20
【问题描述】:

假设我有一个引发异常的方法A:

def methodA(x, y):
     if y != 0: 
         z = x / y
         return z
     else:
         raise ZeroDivisionError("zero can not be a denominator")

在methodB中我调用了methodA而不处理异常:

def methodB(x, y):
     print methodA(x, y)

在这里,我想要一些可以警告我在方法 B 中存在ZeroDivisionError 的潜在风险的东西,最好抓住它。 有什么办法可以在methodA中添加一些特定的代码,或者我们可以使用一些工具发现我忽略了一些重要的异常?

【问题讨论】:

  • 我对此表示怀疑 - 静态分析如何知道您是否故意让异常渗透到更明智的位置以捕获它(这可能根本不在您的代码中,记住!)或有只是忘记处理了吗? methodA 的文档说明它可以 raise ZeroDivisionError 是有帮助的,否则由消费者自行处理。
  • 或者,第三个选项,您是否已经处理过,例如通过检查methodB 中的y > 0 (或调用它的任何地方)?
  • Nitpick:y 是这里的分母,但例外将其称为分子。

标签: python exception-handling static-analysis pylint try-except


【解决方案1】:

我不知道 Python 中有什么接近这种机制的东西,但总的来说,methodA 不应该关心methodB 是否处理异常。在每个级别(例如methodB),只有methodB 可以处理(在某些记录/指定级别)的异常应该被捕获。如果methodB 不能处理例如ZeroDivisionError,那么也许没有人可以(然后不抓住它是正确的做法),或者,可能是在某些调用图中,methodC 会抓住它并做在methodC 的上下文中什么是正确的。

还要注意与 Java 有点相关(但相反)的问题:Java: checked vs unchecked exception explanation

对于 C++,https://softwareengineering.stackexchange.com/questions/114338/why-are-exception-specifications-badShould I use an exception specifier in C++?

【讨论】:

  • "一般methodA 不应该关心methodB 是否处理异常" --- 我会更进一步:通过引发异常,methodA 是 明确表示它不能或不会处理这种情况。 methodA 不仅不关心异常是否被处理,它已经完全放弃了整个程序,并且故意让它崩溃。
  • “它已经完全放弃了整个程序,并且故意让它崩溃”。不,这根本不是真的。如果它放弃了整个程序,它就不需要异常安全。异常安全代码使用异常来说明它无法发挥作用。在这种情况下,异常总是可能恢复,完全取决于调用者。
  • 异常总是使程序崩溃。即使是相对无辜的StopIteration,如果不被捕获和处理,也会导致 Python 程序崩溃。唯一的......呃......例外是调用堆栈更高的一些其他代码(大概知道更好)潜入救援。由于引发异常的代码不知道是否会捕获给定的异常,因此必须始终将raise 命令视为故意使程序崩溃,因为这是最有可能的结果。如果该程序以某种方式幸存下来,那将是一个(希望是令人愉快的)惊喜。
  • 再说一次,我不同意,但让我们离开吧。
  • 同意 --- 这是一个切线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多