Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

decimal.InvalidOperation in python

I was testing my code and I thought that this piece of code was correct:

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

but it's not, since when I input "a", this is what I get:

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 does not catch InvalidOperation. I don't want the program to stop because of that, I want it to keep asking for input until it satisfies the condition. How do I do it?

like image 202
Pigna Avatar asked Dec 31 '15 12:12

Pigna


1 Answers

The signal exceptions in the decimal module are all subclasses of the decimal.DecimalException exception class. You can catch any of the following exceptions to deal with the InvalidOperation exception, from the specific to the (very) generic:

decimal.InvalidOperation
decimal.DecimalException
ArithmeticError
Exception
BaseException

ValueError is not in that hierarchy, but catching Exception would also catch ValueError since it is a subclass. Generally speaking, you rarely want to catch BaseException since that catches all possible exceptions, including SystemExit and MemoryError.

You can catch multiple exceptions in the same handler:

from decimal import Decimal, DecimalException

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

would catch both your original ValueError exceptions, and all signal exceptions raised by the decimal module.

like image 194
Martijn Pieters Avatar answered Sep 19 '22 01:09

Martijn Pieters