我有一段代码,看起来像这样:
try:
my_number = calculate_number()
except KeyboardInterrupt:
raise KeyboardInterrupt()
except:
my_number = float('NaN')
我的意图,我试着计算数量,如果由于某种原因不能完成,只是存储NaN
价值,除非原因很明显,用户不希望数量计算(如按ctrl+c)。虽然这是我想要的,但我想知道这是否是实现这一点的正确方式,在某些情况下它可能会失败,或者是否有更正确的方法来做到这一点。
不需要显式地处理KeyboardInterrupt
。通过捕获Exception
,你排除了KeyboardInterrupt
和一堆其他"内部"。您可能不想捕获异常,但捕获所有其他运行时错误。
try:
my_number = calculate_number()
except Exception:
my_number = float('NaN')
如果你确实想处理除特定异常外的所有内容,那么我只是使用裸raise
重新引发,而不是引发新的KeyboardInterrupt
异常。引发一个新的异常会丢失有关异常最初发生在何处的信息。这对KeyboardInterrupt
来说可能不是很重要,但对其他异常来说绝对很重要。一个额外的好处是,如果您想要排除多个异常,您可以将它们全部合并到单个except
子句中,因为它们的代码都是相同的。
try:
my_number = calculate_number()
except KeyboardInterrupt, ZeroDivisionError:
raise
except:
my_number = float('NaN')
结合这两种方法可以让您不必拼写哪个"系统";不处理的异常,同时指定"运行时";可忽略的异常
try:
my_number = calculate_number()
except ZeroDivisionError, OverflowError:
raise
except Exception:
my_number = float('NaN')