什么是异常?
捕捉异常try...except...
获取异常的信息描述
except捕获多个异常
try...finally
抛出异常
python使用异常对象来表示异常状态,并在遇到错误时引发异常。
异常对象未被处理(或者捕获)时,程序将终止并显示一条错误信息。
>>> 1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>>
白话点:当python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”。
捕获异常 try...except...
异常比较有趣的地方是可以对其进行处理,称之为捕获异常,可使用try/except语句
try: print('-------test----a-----') print('shanhaizhi.txt' , 'r' ) print('-------test----b-----') #可能产生异常的代码,放在try中 except IOERROR: pass #如果产生错误时,处理的方法 #运行结果 -------test----a-----
则:
1.此程序看不到任何错误,因为用except接收了产生IOError错误,并添加了处理错误的方法
2.pass表示实现了相应的动作,但不会有任何输出;如果把pass改成print语句,那么就会有其他输出信息
小结:
1.把可能出现问题的代码,放在try中
2.把处理异常的代码,放在except中
获取异常的信息描述
如下:
try: print num except IOError: print('产生错误了') #运行结果,依然可以看到报错信息 #原因是因为except捕获的错误类型是IOError,但是此时程序产生的异常是NameError,所以except没有生效 修改后代码: try: print num except NameError: print(‘产生错误了’)
在上面的案例中,以ing捕获到异常了,那么这个NameError异常,有没有信息描述呢?
在接收错误类型的后面定义一个变量(例如:errorMsg)用于接收具体错误信息,然后将接收的错误信息打印
try: print num except Nameerror,errorMsg: print(‘产生错误了;%s’ %errorMsg) #运行结果 产生错误了;name ‘num’ is not defined
except捕获多个异常
#coding=utf-8 try: print('--------test---a---') open('shanhaizhi.txt', 'r') #如果shanhaizhi.txt文件不存在,那么会产生IOError异常 print(‘-------test---b---’) #如果num变量没有定义,那么会产生NameError异常 print(num) except (IOError,NameError),errorMsg: #如果像通过一次except捕获到多个异常可以用一个元组的方式 #errorMsg里会保存捕获到的错误信息 print(errorMsg) 运行结果: --------test---a--- -------test---b--- name 'num' is not defined
则:
如果像捕获所有的异常,可以省略except后面的变量。
try...finally...
作用:不管捕捉到的是什么错误,无论错误是不是发生,一些特殊代码读是必须要运行的,例如文件关闭、释放锁、把数据库链接返还给连接池等等
#案例 import time try: f=file('test.txt') while True: line = f.readline() if len(line)== 0: break time.sleep(2) print(line) finally: f.close() print('关闭文件')
1.test.txt文件中每一行数据打印,在上述代码中,每打印一行之前使用time.sleep方法暂停2秒钟;让程序执行的慢一点。在程序执行的时候,按ctrl+c中断或者取消程序。
2.可看到 keyboardInterrupt异常出发,程序退出;但是在退出之前,finally从句仍然被执行,把文件关闭。
else
原本作用为当条件不满足时执行的操作条件
如果在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的操作
try: num = 100 print num except NameError,errorMsg: print('产生错误了:%s' %errorMsg) else: print(‘没有捕获到异常’) finally: print('我一定会执行')
#运行结果:
100
没有捕获到异常
我一定会执行
抛出异常
可使用raise语句来引发一个异常,;异常或者错误对象都必须有一个名字,且它们应该是 Erroe或者Exception类的子类
如下例引发异常的例子
class ShortInputException(Exception): '''你定义的异常类‘’‘ def _init_(self,length,atleast): Exception._init_(self) self.length = length self.atleast = atleast try: s = input(‘请输入 --->’) if len(s) < 3: #raise引发一个你定义的异常 raise ShortInputException(len(s),3) except EOFError: print("你输入了一个结束标记EOF") except ShortInputException,x: # x这个变量被绑定到了错误的实例 print(‘ShortInputException:输入的长度是 %d,长度至少应该是 %d’ %(x.len(s))) else: print('没有异常发生')
#运行结果:
>python raising.py
请输入 -->
你输入了一个结束标记EOF
>python raising.py
请输入 -->
ShortInputException:输入的长度是2,长度至少应该是3
>python raising.py
请输入 -->
没有异常发生