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

参与拿奖:本文已参与「新人创作礼」活动,一起开启掘金创作之路
复制代码
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():

扫描二维码关注公众号,回复: 13752005 查看本文章
#可以使用元组的方式使得一个语句可以捕捉多个异常
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

猜你喜欢

转载自juejin.im/post/7079936514896953374