使用try:捕获异常时,为什么不能返回?

月刊

我想在某些情况下从函数返回时捕获异常:

def myfunc():
    try:
        a = 1
    except:
        pass
    else:
        if a == 1:
            return a
    finally:
        return 100

x = myfunc()
print(x)

我对上面的代码的期望是

  • try 成功(无异常)
  • else满足条件的地方
  • a从函数返回,其余代码未运行

可以想象,我得到的结果100是,该finally子句已经过评估。

由于我显然缺少了某些东西,因此我通过调试器运行了该程序,我确实到达了该return a行,但实际上并没有在那一点返回。

马丁·彼得斯(Martijn Pieters)

finally始终执行。您返回的还不错,只是您误解了finally套件的功能

try声明文档中

returnbreak或者continue声明在执行try一套一的try...finally声明中,finally子句也“的出路。”执行

在这种情况下,exceptelse处理程序try仍然套件的一部分

finally套件是一个清理处理程序。进入try套件后,finally无论发生什么情况都保证将被执行。这也意味着您可以更改返回的内容。明确记录了以下内容:

函数的返回值由最后return执行的语句确定由于该finally子句始终执行,因此在该子句中执行的一条return语句finally将始终是最后一条执行语句

>>>
>>> def foo():
...     try:
...         return 'try'
...     finally:
...         return 'finally'
...
>>> foo()
'finally'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么不捕获异常的代码允许捕获检查异常?

来自分类Java

为什么在Java中捕获多个异常时使用按位OR运算符(|)?

来自分类Java

当您可以捕获Throwables时,为什么还要捕获Java中的异常?

来自分类Java

为什么在使用三元运算符时不能抛出异常

来自分类Java

提供lambda参数时,为什么必须捕获异常?

来自分类Java

为什么您可以抛出未发生的异常但不能捕获它

来自分类Dev

为什么会有未捕获的异常?

来自分类Dev

为什么该程序无法捕获异常?

来自分类Dev

为什么要使用特定的异常捕获块

来自分类Dev

为什么异常没有被try ...除了end;捕获?

来自分类Dev

为什么未捕获此异常?

来自分类Dev

为什么未捕获多父异常?

来自分类Dev

为什么不能通过try / catch SqlException捕获SqlException类型的异常?

来自分类Dev

为什么使用Environment.Exit()而不是抛出异常时需要返回?

来自分类Dev

为什么有时在ActionBlock中尝试/捕获不能捕获此错误?

来自分类Dev

为什么C ++ try / catch不能捕获“纯虚拟调用”异常?

来自分类Dev

使用try / catch不会捕获异常

来自分类Dev

为什么我不能捕获OOM异常?

来自分类Dev

为什么`catch`不能捕获这个异常?

来自分类Dev

为什么try catch块没有捕获promise异常?

来自分类Dev

当我的lua代码引发错误时,为什么不能捕获luabind :: error异常?

来自分类Dev

为什么我不能多次捕获该异常?

来自分类Dev

为什么我的`main()`不能捕获junit测试中`timer`中抛出的异常?

来自分类Dev

为什么不能在通用catch子句中捕获自定义异常

来自分类Dev

为什么我不能正确捕获此异常?

来自分类Dev

为什么不能尝试捕获某些异常的工作?

来自分类Dev

在函数中捕获异常,在 try-catch 中调用。不起作用,为什么?

来自分类Dev

为什么捕获异常指针时异常不一样?

来自分类Dev

为什么 onBindViewHolder 无法从 onBindBaseViewHolder 捕获异常?

Related 相关文章

  1. 1

    为什么不捕获异常的代码允许捕获检查异常?

  2. 2

    为什么在Java中捕获多个异常时使用按位OR运算符(|)?

  3. 3

    当您可以捕获Throwables时,为什么还要捕获Java中的异常?

  4. 4

    为什么在使用三元运算符时不能抛出异常

  5. 5

    提供lambda参数时,为什么必须捕获异常?

  6. 6

    为什么您可以抛出未发生的异常但不能捕获它

  7. 7

    为什么会有未捕获的异常?

  8. 8

    为什么该程序无法捕获异常?

  9. 9

    为什么要使用特定的异常捕获块

  10. 10

    为什么异常没有被try ...除了end;捕获?

  11. 11

    为什么未捕获此异常?

  12. 12

    为什么未捕获多父异常?

  13. 13

    为什么不能通过try / catch SqlException捕获SqlException类型的异常?

  14. 14

    为什么使用Environment.Exit()而不是抛出异常时需要返回?

  15. 15

    为什么有时在ActionBlock中尝试/捕获不能捕获此错误?

  16. 16

    为什么C ++ try / catch不能捕获“纯虚拟调用”异常?

  17. 17

    使用try / catch不会捕获异常

  18. 18

    为什么我不能捕获OOM异常?

  19. 19

    为什么`catch`不能捕获这个异常?

  20. 20

    为什么try catch块没有捕获promise异常?

  21. 21

    当我的lua代码引发错误时,为什么不能捕获luabind :: error异常?

  22. 22

    为什么我不能多次捕获该异常?

  23. 23

    为什么我的`main()`不能捕获junit测试中`timer`中抛出的异常?

  24. 24

    为什么不能在通用catch子句中捕获自定义异常

  25. 25

    为什么我不能正确捕获此异常?

  26. 26

    为什么不能尝试捕获某些异常的工作?

  27. 27

    在函数中捕获异常,在 try-catch 中调用。不起作用,为什么?

  28. 28

    为什么捕获异常指针时异常不一样?

  29. 29

    为什么 onBindViewHolder 无法从 onBindBaseViewHolder 捕获异常?

热门标签

归档