1、基本概念编程
一、什么是异常spa
所谓程序中的异常,就是错误发生的信号,也就是说当程序出错而且程序没有处理这个错误,则会抛出一个异常,而且程序会随着这个异常终止。code
二、程序中错误的分类:blog
(1)语法错误:内存
语法错误,就是程序执行前必需要避免的,好比if语句后面没有冒号、关键字拼写错误等等,这样的错误一目了然,很好避免。资源
(2)逻辑错误:io
逻辑错误是程序运行过程当中发生的“不符合编程逻辑”的错误,具体又能够细分为以下几个:class
<1>ValueError:语法
<2>NameError:程序
<3>IndexError:
<4>KeyError:
<5>AttributeError:
<6>ZeroDivisionError:
<7>TypeError:
三、异常处理的两大分类
(1)对于能够预知的错误的发生,咱们应当用if条件去判断
(2)对于不可预知的错误,咱们只知道可能发生错误的代码块,此时应当利用异常处理机制try...except 去处理
四、try...except详解:
(1)多分支状况:
所谓的多分支,就是说被监测的代码抛出的异常有多种可能性,而且咱们须要针对每一种异常类型都专门定制处理的逻辑。
如上面的代码:当程序运行到 name 的时候,发现有NameError错误,因而程序自动跳到 except NameError as n:这里,并执行这里的代码。注意此时仅仅是对异常的状况进行处理,并无终结程序,这咱们能够从程序中打印出了"HelloWorld"能够验证。
咱们能够把name注释掉,此时程序没有了NameError错误,而会发现下一个IndexError错误:
而程序也并无终结,照样打印出来了HelloWorld。
(2)万能异常——ExcePtion
对于多分支状况,咱们必须得知道具体异常的类型,才能“对症下药”的为每种异常进行相应的处理,而当咱们不肯定会发生什么异常的时候,能够用万能异常解决:
<1>
<2>
(3)try..except 与finally相结合
咱们知道,当咱们利用try...except语句去处理异常的时候,程序会在发生异常的地方“终结代码块”,可是咱们考虑一种状况:当咱们打开一个文件去处理时,在文件关闭以前发生了异常,程序跳出后咱们没法关闭程序,这样会形成内存资源的浪费。针对这样的“回收资源”的应用,咱们能够在整个异常处理的代码块加上finally语句,不管是否抛出异常,finally里面的代码一定会执行。说到这里你们确定知道了,咱们将文件关闭的代码写到finally下面就行了。
try: f = open('whw.txt','r') print(next(f)) print(next(f)) print(next(f)) print(next(f)) #不知道文件中有多少行,不断去next() finally: f.close() #不管是否出错,文件必然会关闭
五、主动触发异常 raise
有时候咱们须要严格限制程序的某些特性,这时候能够用raise主动去抛出异常,例如,当咱们利用自定义元类控制类的建立时,规定类名必须大写,能够这样作:
这样就利用主动触发异常实现类名的限定
六、自定义异常类型
顾名思义,咱们须要自定义一个类来实现异常的处理: