Python 中异常嵌套

在Python中,异常也可以嵌套,当内层代码出现异常时,指定异常类型与实际类型不符时,则向外传,如果与外面的指定类型符合,则异常被处理,直至最外层,运用默认处理方法进行处理,即停止程序,并抛出异常信息。如下代码:

try:
    try:
        raise IndexError
    except TypeError:
        print('get handled')
except SyntaxError:
    print('ok')

运行程序:

Traceback (most recent call last):
  File "<pyshell#47>", line 3, in <module>
    raise IndexError
IndexError

再看另一个被外层try-except捕获的例子:

try:
    try:
        1/0
    finally:
        print('finally')
except:
    print('ok')

运行:

finally
ok

这里值得注意的是except:可以捕获所有的异常,但实际上这样做也有缺点,即有时候会包住预定的异常。

另外,需要提到的是raise A from B,将一个异常与另一个异常关联起来,如果from后面的B没有被外层捕获,那么A,B异常都将抛出,例如:

try:
    1/0
except Exception as E:
    raise TypeError('bad') from E

运行:

复制代码
Traceback (most recent call last):
  File "<pyshell#4>", line 2, in <module>
    1/0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<pyshell#4>", line 4, in <module>
    raise TypeError('bad') from E
TypeError: bad
复制代码

相反,如果外层捕获了B:

try:
    try:
        1/0
    except Exception as E:
        raise TypeError from E
except TypeError:
    print('no'

运行:

no

最后,再看看try-finally在嵌套中的表现。

 try:
    try:
        1/0
    finally:
        print('finally')
except:
    print('ok')

运行:

finally
ok

不管有没有异常发生,或者其是否被处理,finally的代码都要执行,如果异常被处理,则停止,如果没有被处理,向外走,直至最终没处理,采用默认方法处理,上例中,异常在最外层被处理。

复制代码
try:
    try:
        1/0
    except Exception as E:
        print('happens')
    finally:
        print('finally')
except E:
    print('get handled')
复制代码

运行:

happens
finally

异常在内部被处理,不再向外传播。

 

posted @   JohnYang819  阅读(9292)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示