相关疑难解决方法(0)

一旦你进入finally块,如何确定是否引发了异常?

一旦你进入finally条款,是否有可能判断是否有异常?就像是:

try:
    funky code
finally:
    if ???:
        print('the funky code raised')
Run Code Online (Sandbox Code Playgroud)

我想要做更像这样的事情干:

try:
    funky code
except HandleThis:
    # handle it
    raised = True
except DontHandleThis:
    raised = True
    raise
else:
    raised = False
finally:
    logger.info('funky code raised %s', raised)
Run Code Online (Sandbox Code Playgroud)

我不喜欢它需要捕获一个你不打算处理的异常,只是为了设置一个标志.


由于一些评论要求MCVE中的"M"较少,因此这里有一些关于用例的更多背景知识.实际问题是关于日志记录级别的升级.

  • 时髦的代码是第三方,无法更改.
  • 失败异常和堆栈跟踪不包含任何有用的诊断信息,因此logger.exception在except块中使用在此处没有帮助.
  • 如果引发了时髦的代码,那么我需要查看的一些信息已经被记录在DEBUG级别.我们没有也无法处理错误,但是想要升级DEBUG日志记录,因为所需的信息就在那里.
  • 大多数时候,时髦的代码不会引发.我不想升级一般情况下的日志记录级别,因为它太冗长了.

因此,代码在日志捕获上下文(设置自定义处理程序以拦截日志记录)下运行,并且一些调试信息会被追溯重新记录:

try:
    with LogCapture() as log:
        funky_code()  # <-- third party badness
finally:
    mylog = mylogger.WARNING if <there was exception> else mylogger.DEBUG
    for record in log.captured:
        mylog(record.msg, record.args)
Run Code Online (Sandbox Code Playgroud)

python logging exception-handling flow-control try-finally

40
推荐指数
2
解决办法
5090
查看次数