当前位置:  开发笔记 > 编程语言 > 正文

回来吃异常

如何解决《回来吃异常》经验,为你挑选了2个好方法。

我发现以下行为至少很奇怪:

def errors():
    try:
        ErrorErrorError
    finally:
        return 10

print errors()
# prints: 10
# It should raise: NameError: name 'ErrorErrorError' is not defined

returnfinally子句中使用时,异常消失.那是一个错误吗?有记录吗?

但真正的问题(以及我将标记为正确的答案)是:
python开发人员允许这种奇怪行为的理由是什么?



1> SilentGhost..:

returnfinally子句中使用时,异常消失...有记录吗?

它是:

如果finally存在,则指定'cleanup'处理程序.执行try子句,包括任何except和else子句.如果任何子句中发生异常但未处理,则会临时保存该异常.finally子句被执行.如果存在已保存的异常,则会在finally子句的末尾重新引发异常.如果finally子句引发另一个异常或执行return或break语句,则保存的异常将丢失.



2> Carl Meyer..:

您询问了Python开发人员的推理.我不能代表他们,但没有其他行为是有道理的.函数可以返回一个值,也可以引发异常; 它不能两者兼顾."finally"子句的目的是提供"保证"运行的清理代码,无论例外情况如何.通过在finally子句中放置一个return语句,您已经声明要返回一个值,无论如何,无论异常如何.如果Python表现得像你要求并引发了异常,它将破坏"finally"子句的契约(因为它将无法返回你告诉它返回的值).


合理的行为:从`finally`静态地禁止`return`.我们看到它令人困惑.
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有