故意触发异常阻止是不好的形式

时间:2013-04-12 21:19:44

标签: python exception-handling try-catch

有没有更好的方法来做这样的事情:

class SpecialError(Exception):
    pass

try:
    # Some code that might fail
    a = float(a)
    # Some condition I want to check
    if a < 0:
        raise SpecialError
except (ValueError, SpecialError):
    # This code should be run if the code fails
    # or the condition is not met
    a = 999.

1 个答案:

答案 0 :(得分:3)

在各种用例中明确提出异常显然很有用。但是,当你提出一个特别是在当地范围内被捕的例外情况时,你可能正在讨论与你类似的一小部分案例。

一般来说也没有错。在任何给定的用例中,它可能是也可能不是最易读的代码,或者是你的意图中最具沟通性的,但这真的是一种风格判断,而不是其他任何用途。

你可以毫无例外地做到这一点,代价是轻微的DRY违规行为:

try:
    # Some code that might fail
    b = float(a)
    # Some condition I want to check
    if b < 0:
        b = 999.
except ValueError:
    # This code should be run if the code fails
    # or the condition is not met
    b = 999.

...或者以略微重新排序逻辑为代价:

b = 999.
if a >= 0:
    try:
        b = float(a)
    except ValueError:
        pass

或者,不要创建SpecialError,而只需使用ValueError。因为它不会超越这个块,并且你的代码无论如何都会对它们进行相同的处理,它不会添加任何内容:

try:
    b = float(a)
    if b < 0:
        raise ValueError
except ValueError:
    b = 999.

使用你最喜欢的那些,没有人会抱怨。如果你最喜欢的那个不涉及raise,那么我想答案是,“是的,还有更好的方法”;如果确实如此,答案是“不,那是最好的方式。” :)