有时我希望引发一个只有在代码有错误时才会发生的异常。例如,假设函数 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?
一种可能是assert False, "foo() returned illegal value: %s"。另一种选择是 raise Bug("foo() returned illegal value: %s"% switch),用于某些适当的异常类 Bug。对这种情况下的最佳做法有什么想法吗?
请您参考如下方法:
没有冒犯@jonrsharpe :),但我不是特别喜欢ValueError 解决方案。
这有两个原因:
使用他对
ValueError的描述,在以下情况下会引发异常:a built-in operation or function receives an argument that has the right type but an inappropriate value...
您的函数将返回一个不合适的值,而不是接收一个值。
ValueError是针对接收到不适当值的工作代码。但是,您说过要在出现错误时引发错误。意思是,代码被破坏了。
我认为更好的解决方案是提高 AssertionError .在我看来,这样做更清楚,因为它断言(确保)foo 的返回值是好的。
但是,我会这样实现它:
switch = foo()
assert switch in (1, 2, 3), "foo() returned illegal value: %s" % switch
if switch == 1:
...
elif switch == 2:
...
else:
...
如您所见,我将断言语句放在 if 语句之前。这引起了人们的注意,并更清楚地表明我们正在防止异常事件(错误)发生。
