异常:
在程序运行过程中,所发生的不正常的事件,就会中断正在运行的程序。
会发生异常的情况:
①读写文件时,文件不存在;②访问数据库时,数据库管理系统没有启动;③网络连接中断;④算术运算时,除数为零;⑤序列越界等等
错误:
指程序有缺陷,主要分为:语法错误和逻辑错误
语法错误:Python解释器无法解释,在程序执行前纠正
逻辑错误:因为不完整或者不合法的输入导致程序执行得不到预期结果
常见的内置异常分类:
异常类 | 说明 | 举例 |
---|---|---|
NameError | 尝试访问一个未声明的变量 | >>>foo |
ZeroDivisionError | 除数为零 | >>>2/0 |
SyntaxError | 解释器语法错误 | >>>forr |
IndexError | 请求的索引超出序列范围 | >>>iList[] >>>iList[0] |
KeyError | 请求一个不存在的字典关键字 | idict={1:"A",2:"B"} print idict[3] |
IOError | 输入输出异常 | fp=open('myfile') |
AttributeError | 尝试访问未知的对象属性 | class myClass() pass my=myClass() my.id |
1.检查和处理异常
通过try语句检查异常;任何在try语句块里的代码都会被检测,检查是否有异常发生
try语句主要包含两种形式: try - except 和 try - finally
1) try - except
#定义异常监控的一段代码,并且提供处理异常的机制
try:
语句 #被监控异常的代码
except 异常类[,对象]: (ps:通过对象获取异常信息)
语句 #异常处理的代码
语句执行顺序:
首先执行try语句块中的语句;
如果出现异常立即,立即中断try语句块的执行,转到except语句块;
将异常类型与except语句块中的异常匹配,如果匹配成功,执行相应的异常处理。如果匹配不成功将异常传递给更高一级的try语句;
如果异常一直没有找到处理程序则停止执行,抛出异常信息
如图:
while True:
str1='请输入第一个整数\n'
str2='请输入第二个整数\n'
print '开始执行除法运算\n'
try:
op1=input(str1)
op2=input(str2)
result=op1/op2
print '%d / %d = %d'%(op1,op2,result)
except ZeroDivisionError as e:
print e
2) else语句块
try 语句块中没有检测到异常,执行else语句块
try:
语句 #被监控的异常代码
except 异常类[,对象]:
语句 #异常处理代码
else:
语句 #try语句块的代码全部成功时的操作
while True:
str1='请输入第一个整数\n'
str2='请输入第二个整数\n'
print '开始执行除法运算\n'
try:
op1=input(str1)
op2=input(str2)
result=op1/op2
except ZeroDivisionError:
print '除数不能为零'
else:
print '%d / %d = %d'%(op1,op2,result)
3)带有多个的except的try语句
一个try语句块可以对应多个except语句块
try:
语句 #被监控异常的代码
except 异常类1[,对象]:
语句 #异常处理的代码
except 异常类n[,对象]:
语句 #异常处理的代码
del safe_float(obj):
try:
retval=float(obj)
except ValueError:
retval='文本不能转换为float数据'
except TypeError:
retval='类型错误'
return retval
4)异常继承结构
①BaseException类是所有异常之母
②Exception类是其他异常子类的父类(ps:常规错误的基类)
③如果多个except语句块同时出现在同一个try语句中,异常的子类应出现在其父类之前
④引发多种类型的异常:
a.排列except语句的顺序:先子类后父类
b.发生异常时按顺序逐个匹配
c.只执行第一个与异常类型匹配的except语句
del safe_float(obj):
try:
retval=float(obj)
except ValueError:
retval='文本不能转换为float数据'
except TypeError:
retval='类型错误'
except Exception as e:
retval='存在异常'
return retval
5)处理多个异常的except语句
一个except语句块可以处理多个异常,处理多个异常时,要求异常放置在一个元组里
try:
语句 #被监控异常的代码
except (异常类1[,异常类2[,异常类n]])[,对象]:
语句 #异常处理的代码
del safe_float(obj):
try:
retval=float(obj)
except (ValueError,TypeError):
retval='文本或类型不符,不能转换为float数据'
except Exception as e:
retval='存在异常'
return retval
6) finally语句块
①无论是否发生异常都会执行的一段代码
②可以与try语句块一起使用 (ps:只能有一个finally语句块)
try - except - finally
try - except - else - finally
try - finally
③通常用来释放占用的资源,例如:关闭文件,关闭数据库的连接
例如:
try:
语句 #被检测异常的代码
except 异常类[,对象]:
语句 #异常处理的代码
[else:
语句] #try语句块的代码全部成功时的操作
finally:
语句 #无论如何都执行
fp=None
try:
fp=open('D:/BigData/first.py','w+')
fp.write('hello')
except IOError:
print '读写有误'
except Exception:
print '操作有误'
else:
fp.seek(3)
f=fp.readlines()
print f
finally:
fp.close()
print '关闭文件'
7)异常抛出
除了系统自动抛出异常外,在编辑过程中,有些问题是系统无法发现并解决的。例如程序要求文件名不能是"_hello_",此时需要程序员自动抛出异常,把问题提交给调用者去解决。通过抛出异常,接收并处理异常,实现程序的多分支处理。
格式:
raise的常用格式:①raise 异常类 ② raise 异常类(参数或元组)
def filename():
filename=raw_input('please input file name\n')
if filename=='xiaoliu':
raise NameError('不能输入此姓名')
return filename
while True:
try:
filename=filename()
print '名字是%s'%filename
break
except NameError:
print '请换一个名字!'
8.与Java中异常的区别
1)java中的异常:
a.处理异常的方式或者关键词:
try 、catch、finally、throw、throws
b.异常的种类和体系结构
Throwable
Error ——不可恢复的异常
Exception
检查异常——所有的Exception子类,所有的非RuntimeException子类
特点:要求客户或者程序员try或者throws
运行时异常——所有的RuntimeException子类
特点:客户程序员不必手动处理
例如:system.in.read()
主动引发运行时异常
例如:throw new RuntimeException()
2)python中的异常:
a.处理异常的方式或者关键词:
try、except、else、finally、raise
b.异常的种类和体系结构
没有检查异常,只有运行时异常,
详细解释,请看上面的例子!!