Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python logging.raiseExceptions=True不会重新引发异常_Python_Python 3.x_Logging - Fatal编程技术网

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

Python logging.raiseExceptions=True不会重新引发异常,python,python-3.x,logging,Python,Python 3.x,Logging,我试图在我的代码中包含以下功能: 在不中断程序流的情况下记录控制台和/或文件的信息和错误消息以及异常(即,吞咽异常,某种运行模式) 进入开发模式,通过设置develope=True标志引发异常 目前,我正在使用Python3logging模块,它(根据)应该具有内置的功能。然后该标志为logging.raiseExceptions=True 然而,我并没有在MWE中实现这一点:无论我设置的标志是什么,我抛出的异常都不会被重新引发 # mwe.py import logging import

我试图在我的代码中包含以下功能:

  • 在不中断程序流的情况下记录控制台和/或文件的信息和错误消息以及异常(即,吞咽异常,某种运行模式)
  • 进入开发模式,通过设置
    develope=True
    标志引发异常
目前,我正在使用Python3
logging
模块,它(根据)应该具有内置的功能。然后该标志为
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
这将产生以下输出:

# 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
mwe.py(12)信息-已启动
mwe.py(19)错误-出现oops。
回溯(最近一次呼叫最后一次):
文件“mwe.py”,第16行,在
引发运行时错误(“Ooops”)
运行时错误:Ooops。
mwe.py(24)信息-完成

尽管
raiseExceptions
的默认值是
True
,而且我还将其设置为
True
,但为什么我没有进入
GOTCHA
部分?我的配置有什么问题?
或者我对使用
日志记录
来实现这一目的有很大的误解吗


(小问题:有没有办法在
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

啊,我明白了。谢谢你的澄清!对于自定义异常,这里的最佳做法是什么?如果我希望在引发异常时程序不会停止(例如,由于一些错误的输入数据)?我是否应该首先不引发任何自定义异常,而只是记录错误;或者我应该引发自定义异常,然后自动处理它们(例如,通过
sys.excepthook
)。。。我在这里有点困惑/只需使用
try…except
,而无需在except块内重新提升它。有自定义异常是可以的。