异常处理
程序在执行过程中产生的错误为异常,如:列表索引越界,打不开不存在的文件等。
print (a)
open(“123.txt”,“r”)
这个程序运行错误:
1.NameError:描述信息为a没有定义
2.FileNotFoundError:描述信息为没有找到123.txt文件
异常类
在python 中,所有异常类都是Exception的子类
1.NameError
尝试访问一个未声明的变量,会引发NameError
2.ZeroDivisionError
当除数为0时,会引发异常。
事实上,任何数值被零除都会导致上述异常
3.SyntaxError
当解释器发现语法错误时,会引发异常。
demo_list = [“a”, “b”, “c”]
for i in demo_list
print(i)
上述示列,由于for循环的后面缺少冒号,所以导致程序错误。
SyntaxError异常是唯一不在运行时发生的异常,这些错误一般在编译时发生,解释器无法把脚本转换为字节代码。
4.IndexError
当使用序列中不存在的索引时,会引发异常。
demo_list = [ ]
demo_list[0]
上述示列,demo_list 列表中没有任何元素,使用索引0访问列表首位元素时,会有错误:
IndexError:list index out of range
上述信息表明,列表的索引值超出了列表的范围
5.KeyError
当使用字典中不存在的键访问值时,会引发KeyError异常。
dictionary = {“host”: “earth”, “port”:80}
dictionary [“server”]
上述信息表明:出现了字典中没有的键server
6.FileNotFoundError
试图打开不存在的文件时,会引发异常。
7.AttributeError
当尝试访问未知的对象属性是,会引发异常。
class Car(object ):
pass
car = Car()
car.color = “黑色”
print(car.color)
print(car.name)
上述,Car类没有定义任何属性和方法,在创建Car类实例以后,动态的给car引用的实例添加了color属性,然后访问它的color和name属性时,出现错误。
异常处理
try语句用于检测异常,except 语句用于捕获异常。
捕获简单异常
try-except语句格式如下:
try:
#语句块
except :
#异常处理代码
当try里面的某条语句出现错误时,程序将不再继续执行try中的语句,而直接执行except 里处理异常的语句。
捕获多个异常
如果输入的为非数字类型的值,就会产生另一个数值错误的异常。
try:
#语句块
except 异常名称1:
#异常处理代码
except 异常名称2:
#异常处理代码
…
如果一个except 子句想要捕捉多个异常,并且使用同一种处理方式,python 2中可以在except 的后面使用逗号连接多个异常名称;在python 3 必须使用元组来表示。
捕获异常的描述信息
valueerror表示:当方法接收正确数据类型但值不适合的参数时,将引发python 中valueerror异常。
为了区分不同的错误信息,可以使用as获取系统反馈的错误信息。
当监控到ZeroDivisionError或者ValueError这两种异常中的任意一个时,就会把描述信息保存到result变量中。
捕获所有异常
可以在except 语句后使用Exception类表示所有异常,该类是所有异常类的父类。
except 语句跟着一个Exception类的对象result,它用于接收异常的描述信息。由于程序已经处理了所有可能产生的异常,所以不再出现非正常退出的情况。
没有捕获到异常
如果try语句没有捕获到任何的错误信息,就不再执行任何except 语句,而是执行else语句。
终止行为
有一种情况是,无论是否捕捉到异常,都要执行一些终止行为,比如:关闭文件,释放锁等。可以使用finally 语句进行处理。
抛出异常
1.raise语句:能显式的触发异常,
2.使用类名引发异常
当raise语句指定异常的类名时,会创建该类的实例,然后引发异常。
raise IndexError
3.使用异常类的实例引发异常
index_error = IndexError()
raise index_error
4.传递异常
5.指定异常的描述信息
6.异常引发异常
assert语句
自定义异常