异常处理try/raise/assert/with

try:
    main-action
except Exception1:
    handler1
except Exception2:
    handler2
...
else:
    else-block
finally:
    finally-block
  • 这个语句中的main-action代码块会先执行,如果该程序代码引发异常,那么所有except代码块都会逐一测试,执行第一个符合引发异常的except子句下面的语句。如果没有引发异常,将会执行else-block。无论之前发生了什么,当main-action代码块完成时,而任何引发的异常都已经处理后,finally-block就会执行。即使是异常处理器或者else-block内有错误发生而引发了新的异常,finally-block内的程序代码依然会执行。
  • 从语法上讲,except分句数目没有限制,但是应该只有一个else。
  • 只有当main-action中没有发生异常时,else才会执行,当没有相符的except的异常发生时,则不会执行。
  • finally用于定义清理动作,无论异常是否引发或受到处理,都一定会在离开try前运行。
  • try -> except -> else -> finally ;其中else和finally是可选的,可能会有0个或多个except,但是,如果出现一个else的话,必须有至少一个except。

  • raise语句:要显式地触发异常,可以用raise语句,其语句组成是:raise关键字,后面跟着可选的要引发的类或者类的一个实例:
    raise <instance>
    raise <class>
raise IndexError                #Class(instance created)
raise IndexError()          #Instance(created in statement)

  • assert语句 :assert可视为条件式的raise语句。
    assert <test>,<data>
  • 执行起来就像如下的代码:
if __debug__:
    if not <test>:
        raise AssertionError(<data>)
  • 即如果test计算为假,python就会引发异常:data项(如果提供的话)是异常的额外数据。
def f(x):
    assert x < 0, 'x must be negative'
    return x ** 2

  • with/as环境管理器
  • with/as语句的设计是作为常见try/finally用法模式的替代方案。就像try/finally语句,with/as语句也是用于定义必须执行的终止或“清理”行为,无论处理步骤中是否发生异常。不过,和try/finally不同的是,with语句支持更丰富的基于对象的协议,可以为代码块定义支持进入和离开动作。
with expression [as variable]:
    with-block
  • 这里的expression要返回一个对象,从而支持环境管理协议,如果选用的as子句存在时,此对象也可返回一个值,赋值给变量名variable。
with open(r'C:\misc\data') as myfile:
    for line in myfile:
        print(line)
        ...more code here...
<=>
myfile = open(r"C:\misc\data")
try:
    for line in myfile:
        print(line)
        ...more code here...
finally:
    myfile.close()

  • try是捕捉,raise是触发,assert是条件触发,而with是把代码块包装在环境管理器中(定义了进入和离开的行为)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值