我发现以下行为至少很奇怪:
def errors(): try: ErrorErrorError finally: return 10 print errors() # prints: 10 # It should raise: NameError: name 'ErrorErrorError' is not defined
return
在finally
子句中使用时,异常消失.那是一个错误吗?有记录吗?
但真正的问题(以及我将标记为正确的答案)是:
python开发人员允许这种奇怪行为的理由是什么?
return
在finally
子句中使用时,异常消失...有记录吗?
它是:
如果finally存在,则指定'cleanup'处理程序.执行try子句,包括任何except和else子句.如果任何子句中发生异常但未处理,则会临时保存该异常.finally子句被执行.如果存在已保存的异常,则会在finally子句的末尾重新引发异常.如果finally子句引发另一个异常或执行return或break语句,则保存的异常将丢失.
您询问了Python开发人员的推理.我不能代表他们,但没有其他行为是有道理的.函数可以返回一个值,也可以引发异常; 它不能两者兼顾."finally"子句的目的是提供"保证"运行的清理代码,无论例外情况如何.通过在finally子句中放置一个return语句,您已经声明要返回一个值,无论如何,无论异常如何.如果Python表现得像你要求并引发了异常,它将破坏"finally"子句的契约(因为它将无法返回你告诉它返回的值).