一 异常
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"。
print '-----test--1---'
open('123.txt','r') # 此处发生异常,程序崩溃
print '-----test--2---'
异常需要捕获:
try:print('-----test--1---')open('123.txt','r')print('-----test--2---')
except IOError:pass
try 捕获多个异常:
try:print('-----test--1---')open('123.txt','r') # 如果123.txt文件不存在,那么会产生 IOError 异常print('-----test--2---')print(num)# 如果num变量没有定义,那么会产生 NameError 异常except (IOError,NameError): #如果想通过一次except捕获到多个异常可以用一个元组的方式else:print('没有捕获到异常,真高兴')
finally语句可以在异常发生后强制执行:
import time
try:f = open('test.txt')try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)print(content)except:#如果在读取文件的过程中,产生了异常,那么就会捕获到#比如 按下了 ctrl+cpassfinally:f.close()print('关闭文件')
except:print("没有这个文件")
二 异常的传递
如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。
import time
try:f = open('test.txt')try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)print(content)finally:f.close()print('关闭文件')
except:print("没有这个文件")
如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样。
def test1():print("----test1-1----")print(num)print("----test1-2----")def test2():print("----test2-1----")test1()print("----test2-2----")def test3():try:print("----test3-1----")test1()print("----test3-2----")except Exception as result:print("捕获到了异常,信息是:%s"%result)print("----test3-2----")test3()print("------华丽的分割线-----")test2()
三 异常的抛出
raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
class ShortInputException(Exception):'''自定义的异常类'''def __init__(self, length, atleast):#super().__init__()self.length = lengthself.atleast = atleastdef main():try:s = input('请输入 --> ')if len(s) < 3:# raise引发一个你定义的异常raise ShortInputException(len(s), 3)except ShortInputException as result:#x这个变量被绑定到了错误的实例print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))else:print('没有异常发生.')main()