在 python 中记录异常消息的正确方法

wow*_*in2 6 python python-logging

在 Python 中记录异常的最正确方法是什么?

有些人只记录e另一个日志属性e.message(但在某些例外情况下可能会丢失)。
一种用于str()捕获异常的描述,但它不包含错误类型,如果没有错误类型,有时就没用。
实际上repr()会返回错误类型和描述,但它并不那么流行(在我看到的项目中)。

还有一个相关问题:这如何影响像 Sentry 这样收集和分组错误/警报的服务。它们还应该包含一些有关具体错误的信息。

因此想再次开启这个讨论:哪种记录异常的方式最好使用?

def foo():
    """ Method that can raise various types of exceptions """
    1/0  # just for example

try:
    foo()
except Exception as e:
    logger.exception('Error occurred during execution: %s', e)          # 1
    logger.exception('Error occurred during execution: %s', e.message)  # 2
    logger.exception('Error occurred during execution: %s', str(e))     # 3
    logger.exception('Error occurred during execution: %s', str(e.message))  # 4
    logger.exception('Error occurred during execution: %s', repr(e))    # 5
Run Code Online (Sandbox Code Playgroud)

在这里找到了一个旧的讨论,但它不使用logging库,也许从那一刻起有些东西发生了变化。

PS 我知道如何获取追溯和任何其他相关信息。这里的问题是记录异常和错误的一般规则应该是什么。

小智 2

首先,24解决方案不起作用,因为异常中没有任何消息。

然后13给出相同的结果:

division by zero

这些更面向用户(但并没有真正适用于这个例子)。

最后,5显示:

ZeroDivisionError('division by zero')

它更面向开发人员,例如,如果您想调试代码,但在这种情况下,您应该允许 Python 自行显示错误,这样会更加明确。

希望我回答了你的问题!