【问题标题】:Re-raising the exception doesn't work with "finally" clause重新引发异常不适用于“finally”子句
【发布时间】:2017-10-05 11:05:03
【问题描述】:

当我放入 finally 子句时,except 中的 raise 语句不起作用。

所以except 块不会产生Exception

我错过了什么?如果我想在finally 子句返回值后重新提升Exception 需要做什么?

def test():
    res = 1
    try:
            raise Exception
            res = 2
    except:
            print('ha fallado')
            raise

    finally:
            return res
test()

解决方案

def test():
    res = 1
    try:
            raise Exception
            res = 2
    except:
            print('ha fallado')
            raise

    finally:
            # ... finally code that need to exec
            pass

    return res

print(test())

这样,如果发生异常,except块会处理异常然后引发它。

如果没有发生异常,则返回该值。

感谢所有答案!这么快:)

【问题讨论】:

  • return之后你不能再做什么了

标签: python exception


【解决方案1】:

Here 是引用文档相关部分的答案:

try 子句被执行,包括任何 except 和 else 子句。如果任一子句发生异常且未处理,则暂时保存该异常。 finally 子句被执行。如果有一个保存的异常,它会在 finally 子句的末尾重新引发。如果 finally 子句引发另一个异常,则将保存的异常设置为新异常的上下文。 如果 finally 子句执行 return 或 break 语句,则丢弃保存的异常

>>> def f():
...     try:
...         1/0
...     finally:
...         return 42
...
>>> f()
42

附:我不太明白你真正想要达到的目标;正如 zmbq 链接的最佳答案中所述,您不能同时拥有两者。

【讨论】:

  • 感谢您的回答。我明白了,如果没有发生异常,并且在关闭连接的代码等之前,我需要返回我的值。我将编辑带有修复程序的帖子以帮助其他人。
【解决方案2】:

那是因为您在 finally 块中放置了 return 语句。这意味着您确实想要返回一个值,即使抛出异常也是如此。

更多信息请参见here

【讨论】:

  • 感谢您的回答 =)。你们俩都很棒
猜你喜欢
  • 2020-06-18
  • 2016-03-18
  • 2012-01-13
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2014-11-28
  • 2021-09-09
相关资源
最近更新 更多