异常

  • python中为避免代码发生错误影响程序执行,引入了异常。

当python脚本发生异常时,需要捕获并处理异常,否则程序会终止执行。每一个异常都是一些类的实例,这些实例可以被引用,可以通过多种方法进行捕捉,使得错误可以被处理,而不是终止整个程序。另外,异常具有“传播性”,如果未被处理,就会“传播”到函数中,进而到类等高一层次,最终到达程序最顶层,使程序终止。

  • 异常处理(跳过发生错误的语句、语句块,并反馈错误类型,程序并不会终止)

语法如下:

try:

<语句>               #运行的代码

except<异常名称>:

<语句>               #如果try部分发生异常

try的工作原理为:开始一个try语句后,python就在当前程序的上下文中作标记,当出现异常时就会回到做标记的地方。(首先执行try的语句,至于except的语句是否执行则取决于try中语句是否发生异常,另外,只要try中的语句块有一个语句发生异常,后续语句便不会执行。)

  • 抛出异常

raise语句可以抛出指定异常,即通过raise语句可以在代码正确的情况下,输出错误信息。通过类(Exception的子类)或实例参数和raise语句配合使用引发异常(raise语句就是一个输出异常的语句)。在使用类时,程序会自动创建实例。

不想处理异常时,可以在语句块末尾加上一个raise语句,以便查看是否抛出异常,如:

python中常见的内建异常类:

异常名称相关描述
Exception常规错误的基类
AttributeError对象没有这个属性
IOError输入/输出操作失败
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
NameError未声明/初始化对象(没有属性)
SyntaxErrorpython语法错误
SystemError一般解释器系统错误
ValueError传入无效的参数
  • 捕捉多个异常(捕获异常语句的“嵌套”使用)

语法如下:

try:

  <语句>       #运行的代码

except <异常名称1>:

  <语句>       #如果在try部分引发了异常1,则执行该语句

.......

except <异常名称n>:

  <语句>    #如果try部分引发了异常名称n,则执行该语句

只要异常类型和except后面的名称类型相符,就会执行except 后面的语句,一个try语句可以同时有多个except语句,但最多只会执行其中的一个语句。

处理程序时,只会将try语句的子句进行异常处理,对于其他句子则没有作用。若try子句发生的异常在后续的所有except语句后的异常名中都没找到,那么程序会终止,并报错。

抛出异常的优点在于,其可以更简单、直观、清晰的帮助用户定位问题,并且可以自定义异常信息(出现异常后的提示语句),进一步定位问题所在。

  • 使用一个块捕捉多个异常(使用一个try和一个except语句捕捉多个异常,此处也可以直接将except后的异常名写为:Exception,基类异常)

需要使用一个except语句捕捉多个异常时,只需在except 后用元组将异常名列出即可。



  • 捕捉对象

在except语句后加上:as 自定义变量名,就能够输出真正的异常信息,而不是用户自定义的提示信息。


由输出结果可以看到,输出了真正的异常信息,而且,b=name发生错误后,后面的语句没有执行。

  • 全捕捉

对于有些不包含在异常类中的异常,使用try/except语句时就有可能漏掉,进而发生致命错误,但可以在except子句中忽略所有异常类(即except语句后不在标注异常类名),进而使程序输出自己定义的异常信息。

  • 异常中的else

在except整个语句块之后,可以添加一个else语句,else的子句在try的子句没有异常发生的情况下才会执行,而else的子句可以帮助我们判断程序的执行情况。

  • 自定义异常

使用自定义异常主要用于精确定位问题,进而知道问题的根源。

自定义异常即定义继承基类(Exception)的异常类。

  • finally子句

finally需要和try语句组合使用,无论try语句是否执行,都会执行finally语句。另外,try、except、else和finally可以组合使用,但需要注意的是,else在except之后,finally在else和except之后。

其组合使用时,执行流程:先对try的子句执行,发现异常时,执行except语句,然后执行finally子句,如果后面有else语句,则先执行else再执行finally子句。finally子句肯定是最后执行的,另外,如果try没有发生异常,那么先执行else然后在执行finally子句。


  • 异常和函数

异常在函数中引发后,如果没被处理,就会层层传播,除非在某个层次被处理,否则就会使程序终止,输出错误信息。

另外,异常信息是以堆栈的形式被抛出的,即最先发现的异常信息最后被输出(先进后出)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值