Python 3.x 如何在Python3中从decimal获取有用的异常消息?

Python 3.x 如何在Python3中从decimal获取有用的异常消息?,python-3.x,exception,decimal,invalidoperationexception,Python 3.x,Exception,Decimal,Invalidoperationexception,对于Python 2,使用无效字符串创建十进制将产生有用的错误消息: >>> import decimal >>> decimal.Decimal('spam') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2

对于Python 2,使用无效字符串创建十进制将产生有用的错误消息:

>>> import decimal
>>> decimal.Decimal('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 547, in __new__
    "Invalid literal for Decimal: %r" % value)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 3872, in _raise_error
    raise error(explanation)
decimal.InvalidOperation: Invalid literal for Decimal: 'spam'
>>导入十进制数
>>>decimal.decimal('spam'))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py”,第547行,新__
十进制的无效文本:%r“%value”)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py”,第3872行,出现错误
提出错误(解释)
decimal.InvalidOperation:decimal的文本无效:“垃圾邮件”
虽然Python 3产生了一条不太有用的消息:

>>> import decimal
>>> decimal.Decimal('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
>>导入十进制数
>>>decimal.decimal('spam'))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
decimal.invalidooperation:[]
有没有办法从Python3中的异常中获取有用的消息,如“Decimal'spam'无效文本”

我正在达尔文上使用Python2.7.15和Python3.7.2

附录

看起来Python 2曾经有一条关于decimal.invalidooperation的不太有用的消息:


这种情况看起来很相似,但大部分都超出了我的想象:

你可以用猴子修补
十进制
模块

import decimal


def safe_decimal(something):
    try:
        funct_holder(something)
    except Exception as e:
        new_errror = Exception("Hey silly that's not a decimal, what should I do with this? {}".format(something))
        raise new_errror from None


funct_holder = decimal.Decimal
decimal.Decimal = safe_decimal
然后你可以使用猴子补丁版本

>>> decimal.Decimal('hello')
Traceback (most recent call last):
  File "<input>", line 12, in <module>
  File "<input>", line 6, in safe_decimal
Exception: Hey silly that's not a decimal, what should I do with this? hello
>>decimal.decimal('hello'))
回溯(最近一次呼叫最后一次):
文件“”,第12行,在
文件“”,第6行,安全十进制
例外:嘿,傻瓜,这不是小数点,我该怎么处理?你好

我已经将十进制创建封装在一个函数中,该函数的功能与您的函数非常类似(但使用
提升值错误(something)
)。。。我希望我可以直接从
[]
中提取
内容,以避免重复工作。