如何确保在Python中始终以安全的方式获取异常消息?

如何确保在Python中始终以安全的方式获取异常消息?,python,Python,在Java中,获取异常消息与调用某个方法一样简单。 但在Python中,这似乎是不可能的。有时它通过这样做起作用: try: # Code pass except Exception as e: print(e.message) print(e.msg) 但有时捕获这样的异常会引发另一个异常,因为message属性不存在。讽刺地悲伤。试图控制错误会产生另一个错误 有时它通过这样做起作用: try: # Code pass except Exceptio

在Java中,获取异常消息与调用某个方法一样简单。 但在Python中,这似乎是不可能的。有时它通过这样做起作用:

try:
    # Code
    pass
except Exception as e:
    print(e.message)
print(e.msg)
但有时捕获这样的异常会引发另一个异常,因为message属性不存在。讽刺地悲伤。试图控制错误会产生另一个错误

有时它通过这样做起作用:

try:
    # Code
    pass
except Exception as e:
    print(e.message)
print(e.msg)
但有时也会引发缺少属性异常

有时这也很有效:

print(str(e))
但有时它会打印一个空字符串,所以它根本没有用处

我甚至听说这取决于您正在使用的库,取决于具体的异常实现。这对我来说真的很愚蠢。如果我不知道检索错误消息的属性,如何处理打印错误

但有时它会打印一个空字符串,所以它根本没有用处

是的,如果有人在没有消息的情况下引发异常,就会发生这种情况。为此责备(你正在使用的库的)作者

通常,您可以使用
repr
,它应该是明确无误的,如果未重写,则至少包含有关异常类型的信息:

try:
    0/0
except Exception as exc:
    print(repr(exc))
    raise
如果您需要整个回溯,您可以使用

import traceback
try:
    0/0
except Exception:
    print(traceback.format_exc())
    raise
但有时它会打印一个空字符串,所以它根本没有用处

是的,如果有人在没有消息的情况下引发异常,就会发生这种情况。为此责备(你正在使用的库的)作者

通常,您可以使用
repr
,它应该是明确无误的,如果未重写,则至少包含有关异常类型的信息:

try:
    0/0
except Exception as exc:
    print(repr(exc))
    raise
如果您需要整个回溯,您可以使用

import traceback
try:
    0/0
except Exception:
    print(traceback.format_exc())
    raise

我认为一种解决方案是捕获特定的异常,而不是泛型超类捕获每个特定的异常类型,并按照James的建议适当地处理每个异常查看
traceback
模块。如果您的目标是记录“我根本不希望得到的错误”,那么回溯将比表示“操作失败”的随机字符串(或者,如您所说,如果模块编写器未能添加消息,则为空字符串)有用100倍。如果这是一个错误,您希望收到它,那么正如其他人所说的,您应该捕获特定的异常,不是基类
Exception
。我想一个解决方案是捕获特定的异常,而不是泛型超类捕获每个特定的异常类型,并按照James的建议适当地处理每个异常查看
回溯
模块。如果您的目标是记录“我根本不希望得到的错误”,那么回溯将比表示“操作失败”的随机字符串(或者,如您所说,如果模块编写器未能添加消息,则为空字符串)有用100倍。如果这是一个您希望接收的错误,那么正如其他人所说,您应该捕获该特定异常,而不是基类
异常