下面有一些有趣的代码:
def func1():
try:
return 1
finally:
return 2
def func2():
try:
raise ValueError()
except:
return 1
finally:
return 3
func1()
func2()
Run Code Online (Sandbox Code Playgroud)
可以请有人解释,结果将返回这两个函数并解释原因,即描述执行的顺序
我发现以下行为至少很奇怪:
def errors():
try:
ErrorErrorError
finally:
return 10
print errors()
# prints: 10
# It should raise: NameError: name 'ErrorErrorError' is not defined
Run Code Online (Sandbox Code Playgroud)
return在finally子句中使用时,异常消失.那是一个错误吗?有记录吗?
但真正的问题(以及我将标记为正确的答案)是:
python开发人员允许这种奇怪行为的理由是什么?
如果尝试以下代码,则会看到未返回正常的块返回值,但最终的块返回值为:
>>> def f():
... try:
... return "normal"
... finally:
... return "finally"
...
>>> f()
'finally'
Run Code Online (Sandbox Code Playgroud)
一个更高级的示例是在每个return语句中调用一个函数:
在这种情况下,我可以看到:
show函数进行求值(但不返回),show函数进行求值并返回:>>> def show(x):
... print(x)
... return x
...
>>> def g():
... try:
... return show("normal")
... finally:
... return show("finally")
...
>>> g()
normal
finally
'finally'
Run Code Online (Sandbox Code Playgroud)
在finally子句中有return语句是一种好习惯吗?还是它是一个潜在的错误(应通过代码分析工具或代码审查来检测)?
编辑
另一个有例外的示例:
>>> def f():
... try:
... raise ValueError("bad")
... finally:
... return "good"
...
>>> f()
'good'
Run Code Online (Sandbox Code Playgroud)
奇怪的!
我想如果我使用“try”并且只使用“finally”else,没有任何“except”,如果“try”语句无法执行,则应该执行“finally”语句,但之后,应该会出现错误在执行中显示,但在这个简单的代码中,我故意强制执行无效操作,错误永远不会跳转。为什么?
def division_peligrosa(a, b):
try:
a = float(a); b = float(b)
return a/b
finally:
return "Aquí va haber un error..."
print (division_peligrosa(5,0))
print (division_peligrosa("dividendo",28.3))
print ("\nFin del programa, ¡pero nada ocurre!\n")
Run Code Online (Sandbox Code Playgroud) 谁能解释为什么下面的例子没有提高Exception?
def foo():
try:
0/0
except Exception:
print('in except')
raise
finally:
print('in finally')
return 'bar'
my_var = foo()
print(my_var)
Run Code Online (Sandbox Code Playgroud)
这只是返回:
in except
in finally
bar
Run Code Online (Sandbox Code Playgroud)
没有return 'bar'语句的相同代码抛出异常:
in except
in finally
Traceback (most recent call last):
File "test.py", line 10, in <module>
my_var = foo()
File "test.py", line 3, in foo
0/0
ZeroDivisionError: division by zero
Run Code Online (Sandbox Code Playgroud) django的auth中间件有这个代码:
def get_user(request):
"""
Returns the user model instance associated with the given request session.
If no user is retrieved an instance of `AnonymousUser` is returned.
"""
from .models import AnonymousUser
user = None
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
except KeyError:
pass
else: # <------ this doesnot have if-part, but how is it meant to work?
if backend_path in settings.AUTHENTICATION_BACKENDS:
# more code...
Run Code Online (Sandbox Code Playgroud)
该else部分是有趣的,它亘古不变的有if双组分,这是什么?真的很酷,如果我还不知道这一点
python ×5
exception ×3
try-finally ×3
python-3.x ×2
try-except ×2
django ×1
finally ×1
return ×1
try-catch ×1