有没有更好的方法来做这样的事情:
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.
答案 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
,那么我想答案是,“是的,还有更好的方法”;如果确实如此,答案是“不,那是最好的方式。” :)