重新引发异常不适用于“finally”子句

Gém*_*nis 2 python exception

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

所以except块不会产生Exception.

我错过了什么?如果我想重新提高Exceptionafterfinally子句返回值,我需要做什么?

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

    finally:
            return res
test()
Run Code Online (Sandbox Code Playgroud)

解决方案

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())
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lev*_*sky 5

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

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

>>> def f():
...     try:
...         1/0
...     finally:
...         return 42
...
>>> f()
42
Run Code Online (Sandbox Code Playgroud)

PS我不太明白你真正想要实现的目标;正如zmbq链接的最佳答案中所述,您不能真正拥有两者。