gpt4 book ai didi

python - logging.raiseExceptions = True 不会重新引发异常

转载 作者:行者123 更新时间:2023-11-30 22:47:34 24 4
gpt4 key购买 nike

我试图在我的代码中具有以下功能:

  • 将信息和错误消息以及异常记录到控制台和/或文件,而不中断程序流程(即吞噬异常、某种运行模式)
  • 通过设置 develop = True 标志进入开发模式,在该模式下会引发异常

目前,我正在使用 Python3 logging 模块,该模块(根据 this )应该内置该功能。该标志为 logging.raiseExceptions = True

但是,我无法让它在 MWE 中工作:无论我设置的标志是什么,我抛出的异常都不会重新引发。

# mwe.py
import logging
import logging.config

if __name__ == '__main__':
# Configure logging and set flag to raise exceptions
logging.config.fileConfig('log.conf')
logging.raiseExceptions = True

logger = logging.getLogger('root')

logger.info('Started')

# Test whether exceptions get raised
try:
raise RuntimeError("Ooops.")
except RuntimeError:
try:
logger.exception('There was an oops.')
# which is the same as logger.error('...', exc_info=True)
except:
print("GOTCHA! Exception was re-raised.")

logger.info('Finished')

对应的配置文件:

# log.conf
[loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=consoleFormatter

[logger_root]
handlers=consoleHandler
level=DEBUG

[handler_consoleHandler]
class=logging.StreamHandler
formatter=consoleFormatter
args=(sys.stdout,)

[formatter_consoleFormatter]
format=%(filename)s (%(lineno)d) %(levelname)-8s - %(message)s

这会产生以下输出:

mwe.py (12) INFO     - Started
mwe.py (19) ERROR - There was an oops.
Traceback (most recent call last):
File "mwe.py", line 16, in <module>
raise RuntimeError("Ooops.")
RuntimeError: Ooops.
mwe.py (24) INFO - Finished
<小时/>

为什么我没有到达 GOTCHA 部分,尽管 raiseExceptions 的默认值是 True 并且另外我也将其设置为正确?我的配置有什么问题吗?
或者我对为此目的使用日志记录有什么很大的误解吗?

(小问题:有没有办法在 log.conf 文件中配置 raiseException 标志?)

最佳答案

你搞错了。这不会重新引发任何自定义异常。这是为了改变日志记录模块的默认行为,该行为会吞掉内部日志记录异常,即配置错误的记录器试图写入没有写入权限的文件。默认情况下,这将自动失败,并且设置 logging.raiseException = True 将导致记录器配置错误或日志记录模块内的任何其他问题引发您必须处理的异常。

现在谈谈您想要实现的目标。记录异常回溯而不抑制异常(让它传播)是默认行为。如果未配置日志记录,则回溯将转到 stderr。如果配置了日志记录,则由日志记录处理程序将其写入所需位置。
所以基本上为了实现你的目标,你根本不应该处理异常。但是,如果您知道如何处理异常(意味着您知道导致异常的原因),那么通常不需要记录回溯。
如果您坚持,您仍然可以在 except RuntimeError 子句中使用 logger.exception(...) 并使用纯 raise 重新引发异常:

try:
raise RuntimeError("Ooops.")
except RuntimeError:
logger.exception('There was an oops.')
raise

关于python - logging.raiseExceptions = True 不会重新引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40483339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com