相关疑难解决方法(0)

Python尝试finally块返回

下面有一些有趣的代码:

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)

可以请有人解释,结果将返回这两个函数并解释原因,即描述执行的顺序

python try-catch try-finally try-except

59
推荐指数
3
解决办法
5万
查看次数

回来吃异常

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

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)

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

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

python return exception finally

26
推荐指数
3
解决办法
3025
查看次数

在finally子句中返回值是否错误?

如果尝试以下代码,则会看到未返回正常的块返回值,但最终的块返回值为:

>>> def f():
...     try:
...         return "normal"
...     finally:
...         return "finally"
... 
>>> f()
'finally'
Run Code Online (Sandbox Code Playgroud)

一个更高级的示例是在每个return语句中调用一个函数:

在这种情况下,我可以看到:

  • 在普通块中,对show函数进行求值(但不返回),
  • 在finally块中,对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)

奇怪的!

python try-finally python-3.x

7
推荐指数
1
解决办法
139
查看次数

使用“try”+“finally”而不使用“except”永远不会产生任何错误

我想如果我使用“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 try-finally python-3.x

6
推荐指数
1
解决办法
3923
查看次数

如果最终返回值,则不会引发 python 异常

谁能解释为什么下面的例子没有提高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)

python exception-handling exception try-except

5
推荐指数
1
解决办法
222
查看次数

django - 使用'else:' - 有趣的案例

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 django

-1
推荐指数
1
解决办法
56
查看次数