nos*_*klo 26 python return exception finally
我发现以下行为至少很奇怪:
def errors():
    try:
        ErrorErrorError
    finally:
        return 10
print errors()
# prints: 10
# It should raise: NameError: name 'ErrorErrorError' is not defined
return在finally子句中使用时,异常消失.那是一个错误吗?有记录吗?
但真正的问题(以及我将标记为正确的答案)是:
python开发人员允许这种奇怪行为的理由是什么?
Car*_*yer 35
您询问了Python开发人员的推理.我不能代表他们,但没有其他行为是有道理的.函数可以返回一个值,也可以引发异常; 它不能两者兼顾."finally"子句的目的是提供"保证"运行的清理代码,无论例外情况如何.通过在finally子句中放置一个return语句,您已经声明要返回一个值,无论如何,无论异常如何.如果Python表现得像你要求并引发了异常,它将破坏"finally"子句的契约(因为它将无法返回你告诉它返回的值).
这是finally 块中返回的有趣比较,其中包括 - Java/C#/Python/JavaScript:(存档链接)
从最后返回
就在今天,我正在帮助解决 Java 中的一些错误,并遇到了有趣的问题 - 如果在 try/catch 语句中使用 return 会发生什么?最后部分是否应该启动?我将问题简化为以下代码片段:
下面的代码打印出什么?
Run Code Online (Sandbox Code Playgroud)class ReturnFromFinally { public static int a() { try { return 1; } catch (Exception e) {} finally{ return 2; } } public static void main(String[] args) { System.out.println(a()); } }我最初的猜测是,它应该打印出来
1,我正在打电话return,所以我假设,会被返回。然而,事实并非如此:我理解逻辑,最后部分必须执行,但不知怎的,我对此感到不安。让我们看看 C# 在这种情况下做了什么:
Run Code Online (Sandbox Code Playgroud)class ReturnFromFinally { public static int a() { try { return 1; } catch (System.Exception e) {} finally { return 2; } } public static void Main(string[] args) { System.Console.WriteLine(a()); } }我更喜欢这种行为,控制流不能在finally子句中被搞乱,所以它可以防止我们搬起石头砸自己的脚。为了完整起见,让我们检查一下其他语言是做什么的。
Python:
Run Code Online (Sandbox Code Playgroud)def a(): try: return 1 finally: return 2 print a()JavaScript:
Run Code Online (Sandbox Code Playgroud)<script> function ReturnFromFinally() { try { return 1; } catch (e) { } finally { return 2; } } </script> <a onclick="alert(ReturnFromFinally());">Click here</a>C++ 和 PHP 中没有 finally 子句,因此我无法尝试我拥有编译器/解释器的最后两种语言。
我们的小实验很好地表明,C# 对于这个问题有最好的方法,但我很惊讶地发现,所有其他语言都以相同的方式处理这个问题。
| 归档时间: | 
 | 
| 查看次数: | 3025 次 | 
| 最近记录: |