在最后一个街区内“提升”

时间:2015-10-25 16:37:34

标签: python exception exception-handling

我想执行一个函数,如果结果是None或者引发了异常,我想做点什么。另外,如果提出异常,我想在完成后重新提起它。

以下代码有效,但它看起来不是正确的解决方案,我没有找到任何关于在raise块中使用裸finally的文档。这里有什么正确的解决方案?

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()来完成,但我不想这样做,因为它实际上是一个我不想改变或复制的代码片段。

2 个答案:

答案 0 :(得分:2)

我认为您根本不需要finally条款 - 您可以在result内检查else是否为无:

try:
    result = func()
except:
    handle_none_or_exception()
    raise
else:
    if result is None:
        handle_none_or_exception()

答案 1 :(得分:0)

finally部分是执行的清理部分,无论try-except部分发生了什么。

在您的情况下,您有几个disctint情况(错误,没有错误和无值,没有错误,没有None值)。这就是为什么finally阻止不适合该任务的原因,我想这是你的评论的结果" 它看起来不是正确的解决方案 "

文档中有一个提示(" try语句"),这使得无法提升:

  

在此期间,程序无法使用例外信息   执行finally子句。