问题描述
我想执行一个函数,如果结果为无或引发异常,我想做些事情。 另外,如果提出了例外,我想在结束后再提出。
以下代码可以工作,但是它看起来不像是正确的解决方案,而且我没有找到任何有关在finally
块内使用裸raise
文档。
这里正确的解决方案是什么?
exception_caught = False
try:
result = func()
except:
result = None
exception_caught = True
finally:
if result is None:
handle_none_or_exception()
if exception_caught:
raise
更新:我知道可以通过handle_none_or_exception()
调用handle_none_or_exception()
来完成,但是我不想这样做,因为这实际上是我不想更改或重复的代码片段。
1楼
我认为您根本不需要finally
子句-您可以在else
内部检查result
是否为None:
try:
result = func()
except:
handle_none_or_exception()
raise
else:
if result is None:
handle_none_or_exception()
2楼
无论try-except
部分发生了什么, finally
部分都是执行的cleanup部分。
在您的情况下,您有几种情况(错误,无错误和无值,无错误且无值)。
这就是为什么finally
块不适合该任务的原因,我想这是您的评论所提到的“ 它看起来不像是正确的解决方案 ”。
docs(“ try语句”)中有一个提示,使裸露不可能:
在执行finally子句期间,异常信息不可用于程序。