我正在测试我的代码,我认为这段代码是正确的:
while True: try: p = Decimal(raw_input(...)) if ...condition... : break else: raise ValueError except ValueError: print "Error! ..."
但事实并非如此,因为当我输入"a"时,这就是我得到的:
File "multiple.py", line 28, inprecision = Decimal(raw_input(...)) File "/usr/lib/python2.7/decimal.py", line 548, in __new__ "Invalid literal for Decimal: %r" % value) File "/usr/lib/python2.7/decimal.py", line 3872, in _raise_error raise error(explanation) decimal.InvalidOperation: Invalid literal for Decimal: 'a'
ValueError不会捕获InvalidOperation.我不希望程序停止因为这个,我希望它一直要求输入,直到它满足条件.我该怎么做?
decimal
模块中的信号异常都是decimal.DecimalException
异常类的子类.您可以捕获以下任何异常来处理InvalidOperation
异常,从特定到(非常)泛型:
decimal.InvalidOperation decimal.DecimalException ArithmeticError Exception BaseException
ValueError
不在该层次结构中,但捕获Exception
也会捕获,ValueError
因为它是一个子类.一般来说,你很少想要捕获,BaseException
因为它捕获所有可能的异常,包括SystemExit
和MemoryError
.
您可以在同一个处理程序中捕获多个异常:
from decimal import Decimal, DecimalException while True: try: p = Decimal(raw_input(...)) if ...condition... : break else: raise ValueError except (ValueError, DecimalException): print "Error! ..."
将捕获您的原始ValueError
异常,以及decimal
模块引发的所有信号异常.