4

Is there a better way of doing something like this:

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.
4

1 回答 1

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.

使用您最喜欢的其中一个,没有人会抱怨。如果您最喜欢的那个不涉及 a raise,那么我想答案是,“是的,有更好的方法”;如果是这样,答案是,“不,这是最好的方法。” :)

于 2013-04-12T21:36:10.717 回答