我们写完python执行的时候是不是经常会遇到报错,而且报错都是大片红字,这样给别人的感受就是你写的程序怎么老是出问题啊,这样我们还咋么混下去呢?于是乎,就有了异常处理的东东。
python的try语句有两种风格---一种是处理异常(try/except/else),一种是无论是否发生异常都将执行最后的代码(try/finally)。
try:<语句> #运行代码except <异常的名字>:<语句> #哪个异常符合执行哪个except <异常的名字> as <报错的信息>:<语句> #报错信息可以以变量形式打印else:<语句> #没有异常时执行第二种处理异常如下:
try:
<语句>except <异常的名字>:<语句> finally:<语句> #退出时总是执行 try:
open("test.txt",'r') #打开一个不存在的文件
except IOError: #捕捉这个异常
pass #表示实现了相应的实现,但什么也不做。
第二个例子:
try语句子句形式表如下except: 捕获所有异常except name: 只捕获特定的异常except name as value: 捕获异常和它的附加数据except (name1,name2): 捕获任何列出的异常else: 如果没有异常finally: 总是执行常见异常:
Exception 所有异常的基类
AttributeError 特性应用或赋值失败时引发
IOError 试图打开不存在的文件时引发
IndexError 在使用序列中不存在的索引时引发
KeyError 在使用映射不存在的键时引发
NameError 在找不到名字(变量)时引发
SyntaxError 在代码为错误形式时引发
TypeError 在内建操作或者函数应用于错误类型的对象是引发
ValueError 在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发
ZeroDivisionError 在除法或者摸除操作的第二个参数为0时引发
还有一个就是主动触发异常(raise)。
raise语法格式如下:
raise [Exception [, args [, traceback]]]
语句中Exception是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
格式如下:
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
举个例子:
try: for i in range(3): for i in range(3): if i == 2: raise KeyboardInterrupt print(i,j) except KeyboardInterrupt: print('退出!')
学了以上的知识点后,我们可以来看下底下这个例子:
try: f = open('test1.txt','r') #提示:打开不存在文件就出错了,此时还未打开文件,因此根本就没有f这个变量 f.read() except IOError as e: print('错误:',e) except SyntaxError: pass except NameError as msg: print('错误:'+str(msg)) except: print('对的,都是你的错') else: print('读取成功') finally: f.close() #无论咋样都要关闭文件
看完之后你们觉得这个会有什么问题呢?
最后在文件关闭的时候会报错如下:

那我们怎么规避呢?思考下吧~~~~
答案如下:
try: f = open('test1.txt','r') f.read() except IOError as e: print('错误:',e) except SyntaxError: pass except NameError as msg: print('错误:'+str(msg)) except: print('对的,都是你的错') else: print('读取成功') finally: if 'f' in locals(): #如果文件对象变量存在当前局部变量符号表的话就说明打开成功了 f.close()
简单吧,嘻嘻^-^