Python异常代表一个bug?

aug*_*rar 1 python exception

我有时希望提出一个只有在代码有错误时才会发生的异常.例如,假设函数foo应返回1到3之间的整数.请考虑以下代码:

switch = foo()  # Should be an integer between 1 and 3
if switch == 1:
    ...
elif switch == 2:
    ...
elif switch == 3:
    ...
else:
    # What goes here?
Run Code Online (Sandbox Code Playgroud)

一种可能性是类似的assert False, "foo() returned illegal value: %s".另一个选择是raise Bug("foo() returned illegal value: %s" % switch),对于一些适当的异常类Bug.对这种情况下的最佳做法有何看法?

iCo*_*dez 7

没有冒犯@jonrsharpe :),但我不是特别喜欢这个ValueError解决方案.

这有两个原因:

  1. 使用他给出的描述ValueError,在以下情况下引发异常:

    内置操作或函数接收具有正确类型但不适当值的参数...

    你的函数将返回一个不合适的值,而不是一个.

  2. A ValueError用于接收不适当值的工作代码.但是,您说您想在发生错误时引发错误.意思是,代码被破坏了.

我认为更好的解决方案是提高AssertionError.在我看来,这样做更清楚,因为它断言(确保)返回值foo是好的.

但是,我会像这样实现它:

switch = foo()
assert switch in (1, 2, 3), "foo() returned illegal value: %s" % switch
if switch == 1:
    ...
elif switch == 2:
    ...
else:
    ...
Run Code Online (Sandbox Code Playgroud)

如您所见,我将断言声明放在if 语句之前.这引起了人们的注意,并使我们更清楚地知道我们正在防止发生异常(一个错误).


jon*_*rpe 5

你应该raise ValueError.这是提供不可接受的值的情况的例外.

从文档:

例外 ValueError

当内置操作或函数接收到具有正确类型但不适当值的参数时引发,并且情况不会被更精确的异常描述,例如IndexError.