1.异常处理
①异常指程序运行时引发的错误,可以使用异常处理结构来提高程序的健壮性和容错性;也可以为用户提供更加友好的提示;
②注意:编程应该避免过多依赖于异常处理机制来提高程序的健壮性;
③注意:如果异常没有被捕捉或者出现在else/finally语句块中会在finally语句之后被抛出;
2.代码演示:
①使用继承Python内置的异常类来实现自定义类的错误处理
class myError(Exception):
"自定义异常类"
def __init__(self,length,atleast):
Exception.__init__(self) #调用父类构造函数
self.length=length
self.atleast=atleast
#使用try语句块来检测异常
try:
s=input('请输入一个字符串:')
if len(s)<3:
raise myError(len(s),3) #抛出可能出现异常的语句
except EOFError: #捕捉异常
print('您输入了一个结束标记(EOF)!')
except myError as x:
print('myError:输入长度为 %d,长度至少应该是:%d' %(x.length,x.atleast))
else:
print('没有捕捉异常!')
结果如下:
请输入一个字符串:12
myError:输入长度为 2,长度至少应该是:3
②类似与案例①
class myError1(Exception):
def __init__(self,value):
self.value=value
def __str__(self):
return repr(self.value)
try:
raise myError1(2*2)
except myError1 as x:
print('My exception occurred,value:',x.value)
#raise myError1('hello')
③一个包含多个except块的模块
class myError2(Exception): #继承Pytho的异常类
pass
class myError3(myError2): #继承父类
def __init__(self,expression,message):
self.expression=expression
self.message=message
class myError4(myError2): #继承父类
def __init__(self,previous,next,message):
self.previous=previous
self.next=next
self.message=message
检测语句:
try:
s1=input('请输入1:')
s2=input('请输入2: ')
s3=input('请输入3:')
if len(s1)>0 and len(s2)>0 and len(s3)==0:
raise myError3(s1,s2)
elif len(s1)>0 and len(s2)>0 and len(s3)>0:
raise myError4(s1,s2,s3)
except EOFError:
print('您输入了一个结束标志(EOF)!')
except myError3 as x:
print('输入了两个信息分别是:expression:%s,message:%s '%(x.expression,x.message))
except myError4 as x:
print('输入了三个信息!')
else:
print('没有异常!')
3.异常处理结构分析
①try…except
#直到用户输入数据为数字结束循环
while True:
try:
x=int(input('Please input a number:'))
break
except ValueError:
print('Input type error!')
②try…except…except…
#含有多个except语句的try结构
try:
i=float(input('被除数:'))
i1=float(input('除数:'))
z=i/i1
except ValueError:
print('数值类型为数值!')
except ZeroDivisionError:
print('除数不能为0!')
except TypeError:
print('两者数据类型应为数值!')
except NameError:
print('变量不存在!')
else:
print(i,'/',i1,'=',z)
③try…except():
#可以使用元组的方式使得一个语句可以捕捉多个异常
import sys
import os
try:
f=open('1.txt','r+')
s=f.readline()
#print(s,end='\n')
i=int(s.strip())
#print(i,end='\n')
except (OSError,ValueError,RuntimeError,NameError):
pass
④try…except…finally(无论是否抛出异常都会执行)
try:
3/0
except:
print(3)
finally:
print(5)
输出结果:
3
5
⑤注意!
#注意:如果异常没有被捕捉或者出现在else/finally语句块中会在finally语句之后被抛出
def divide(x,y):
try:
result=x/y
except ZeroDivisionError:
print('division is zero!',end='\n')
else:
print(x,'/',y,'=',result,end='\n')
finally:
print('executing finally clause',end='\n')
divide(1,2)
divide(1,0)
divide("2","1")
输出结果:
1 / 2 = 0.5
executing finally clause
division is zero!
executing finally clause
executing finally clause
result=x/y
TypeError: unsupported operand type(s) for /: 'str' and 'str'
⑥注意!
应尽量避免在包含finally语句块的异常处理模块中使用return语句!
学习笔记
1.引发程序运行出错的情况很多,严格来说语法错误和逻辑错误不属于异常;
2.异常机制非常重要也非常有效,但不建议使用异常机制来代替常规检查;
3.在编程过程中因该避免过多依赖于异常处理机制来提高程序健壮性;
4.Python中异常处理结构有try…except;try…except…else;try…except…except…;try…except…finally…;try…except…else…finally…等几种组合;
5.可以继承Python自带的异常处理类Exception