Python程序设计之异常处理(1)

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

发布了78 篇原创文章 · 获赞 83 · 访问量 5406

猜你喜欢

转载自blog.csdn.net/qxyloveyy/article/details/104672156