5

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

有些人 lo​​g just e,另一个 logs 属性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

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

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

4

1 回答 1

1

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

然后13给出相同的结果:

division by zero

这些更面向用户(但并未真正使用此示例)。

最后,5显示:

ZeroDivisionError('division by zero')

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

希望我回答了你的问题!

于 2019-07-08T10:23:03.327 回答