记录并引发异常

que*_*ode 21 python error-handling python-3.x

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

import logging

if not condition_met:
    missing = set_one - set_two
    logging.error('Missing keys: {}'.format(missing))
    raise ValueError('Missing keys: {}'.format(missing))
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 14

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

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
Run Code Online (Sandbox Code Playgroud)

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


小智 7

您可以使用loggerexception()功能:

from logger import exception

try:
    . . .
except Exception as error:
    exception(msg="Your message")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,这实际上并不会引发异常,它只是使用完整的堆栈跟踪记录它(它基本上与 `logger.error("Your message", exc_info=True)` 相同,因此它不会回答问题。 (12认同)