代码之家  ›  专栏  ›  技术社区  ›  Pigna

十进制的python中的InvalidOperation

  •  9
  • Pigna  · 技术社区  · 9 年前

    我正在测试我的代码,我认为这段代码是正确的:

    while True:
        try:
            p = Decimal(raw_input(...))
            if ...condition... : break
            else: raise ValueError
        except ValueError:
            print "Error! ..."
    

    但不是,因为当我输入“a”时,我得到的是:

    File "multiple.py", line 28, in <module>
      precision = 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。 我不希望程序因此而停止,我希望它继续请求输入,直到满足条件为止。我该怎么做?

    1 回复  |  直到 9 年前
        1
  •  18
  •   Martijn Pieters    9 年前

    中的信号异常 decimal 模块都是 decimal.DecimalException exception class 。您可以捕获以下任何异常来处理 InvalidOperation 例外,从特定到(非常)一般:

    decimal.InvalidOperation
    decimal.DecimalException
    ArithmeticError
    Exception
    BaseException
    

    ValueError 不在该层次结构中,但 Exception 也会抓住 值错误 因为它是一个子类。一般来说,你很少想抓住 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! ..."
    

    会抓住你的原版 值错误 异常,以及由 十进制的 单元