一旦你进入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块中使用在此处没有帮助.因此,代码在日志捕获上下文(设置自定义处理程序以拦截日志记录)下运行,并且一些调试信息会被追溯重新记录:
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)