记录并引发异常

Posted

技术标签:

【中文标题】记录并引发异常【英文标题】:Logging and raising an exception 【发布时间】:2019-03-11 08:29:35 【问题描述】:

我想保持一个可靠的日志系统运行,但也有必要引发异常。这段代码完成了我的目标,但它看起来很笨重而且不是很 Pythonic。有什么更好的选择?

import logging

if not condition_met:
    missing = set_one - set_two
    logging.error('Missing keys: '.format(missing))
    raise ValueError('Missing keys: '.format(missing))

【问题讨论】:

保存字符串s = 'Missing keys: '.format(missing),然后使用两次 @Chris_Rands 绝对是我正在考虑的事情之一。还有什么更优雅的吗? 视情况而定,但记录然后引发异常通常被认为是反模式。它是多余的并且使日志杂乱无章。除非您期望某些东西能够捕获该异常并抑制消息,否则不要记录。 Pythonic 并不是真正的外观,因为它是代码的格式。你所拥有的将起作用。如果您想使用较新的字符串,您可以使用 f-string,例如,f'Missing Keys: missing',这是 Python 3.6 中的新功能。 @Jean-FrançoisFabre 在这种特殊情况下,我正在做一些复杂的数据分析并构建这个工具以供我的团队使用,即其他几个 Python/软件经验少得多的人需要知道如何使用这个。日志是我希望拉平学习曲线的方法之一。 【参考方案1】:

此时您可以捕获异常并记录错误,因此如果发生另一个异常,您也可以记录它,并将异常传播到上游。

try:
   # some code

    if not condition_met:
        missing = set_one - set_two
        raise ValueError('Missing keys: '.format(missing))   

except Exception as e:  # or ValueError to narrow it down
    logging.error(str(e))
    raise   # propagate the exception again

请注意,在不记录回溯的情况下记录异常会留下一些未完成的事情,特别是在上游捕获并处理异常时。您很可能永远不会修复该特定错误。

【讨论】:

【参考方案2】:

你可以使用loggerexception()函数:

from logger import exception

try:
    . . .
except Exception as error:
    exception(msg="Your message")

这样所有的堆栈都会被记录下来。

您可以阅读一篇关于此here 的有趣文章。

【讨论】:

以上是关于记录并引发异常的主要内容,如果未能解决你的问题,请参考以下文章

渲染期间引发的异常:RelativeLayout 中不存在循环依赖项 异常详细信息记录在“窗口”>“显示视图”>“错误日志”中

使用 Psycopg2 从 Redshift 写入文件引发异常

尝试使用 where 子句中使用的 like 语句删除记录时,Advantage 数据库引发异常

如何在引发时将变量传递给异常并在异常时检索它?

如何返回值并引发异常

Spark记录-Scala异常处理与文件I/O