jiu
mi
吗?

异常处理实例

1、继承Python内置异常类实现自定义异常类

来源:《python程序设计》第四版

作者:董付国

'''
继承Python内置异常类实现自定义异常类
'''
class ShortInputException(Exception):
    '自定义异常类'
    def __init__(self,length,atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast
try:
    s = input('请输入-->')
    if len(s) < 3:
        raise ShortInputException(len(s),3)
except EOFError:
    print('您输入了一个结束标识符EOF')
except ShortInputException as x:
    print('ShortInputException:输入的长度是%d,长度至少应该时%d' %(x.length,x.atleast))
else:
    print('没有发生异常')

2、异常处理例子

'''
异常处理
'''
class MyError(Exception):
    def __init__(self,value):
        self.value = value
    def __str__(self):
        return repr(self.value)
try:
    #先尝试以下,下面有没有错误,靠有错误,直接跳到except语句
    raise MyError(2*2)
except MyError as e:
    #e,是从MyError调用的
    print('我发错误出现,value:',e)
raise MyError('oops!')

3、如果自己编写的某个模块需要抛出多个不同但相关的异常 可以先创建一个基类 然后创建多个派生类表示不同的异常

'''
如果自己编写的某个模块需要抛出多个不同但相关的异常
可以先创建一个基类
然后创建多个派生类表示不同的异常
'''
class Error(Exception): #基类
    pass
class InputError(Error):    #派生类
    '''
    Exception raise for errors in the input
    Attributes:
        expression——input expression in which the error occurred message——explanation of the error
    '''
    def __init__(self,expression,message):
        self.expression = expression
        self.message = message
class TransitionError(Error):   #派生类
    '''
    Raised when an operation attempts a state transition that's not allowed
    Attributes:
        privious——state at beginning of transition
        next——attempted new state
        message——explanation of why the specific transition is not allowed
    '''
    def __init__(self,previous,next,message):
        self.previous=previous
        self.next = next
        self.message = message

4、使用异常处理 实现,只能输入数字 输入其它的,则被异常捕捉,然后重新输入

'''
使用异常处理
实现,只能输入数字
输入其它的,则被异常捕捉,然后重新输入
'''
while True:
    try:
        x=int(input('Please enter a number:'))
        break
    except ValueError:
        print('That was not a valid number.Try again……')

5、再使用时,except自居可以再异常类名字后面指定一个变量 用来捕获异常的参数或更详细的信息

'''
再使用时,except自居可以再异常类名字后面指定一个变量
用来捕获异常的参数或更详细的信息
'''
try:
    raise Exception('spam','eggs')
except Exception as inst:
    print(type(inst))
    print(inst.args)
    print(inst)

    x,y=inst.args
    print('x=',x)
    print('y=',y)

6、try……except……else……结构 如果try中代码抛出了异常,并且被某个except捕捉。 则执行相应的异常处理代码,这种情况不会执行else中 的代码,如果try中的代码没有抛出任何异常,则执行 else块中的代码

'''
try……except……else……结构
如果try中代码抛出了异常,并且被某个except捕捉。
则执行相应的异常处理代码,这种情况不会执行else中
的代码,如果try中的代码没有抛出任何异常,则执行
else块中的代码
'''
a_list = ['China','America','England','France']
while True:
    n = input("请输入字符串的序号:")
    try:
        n = int(n)
        print(a_list[n])
    except(IndexError,ValueError):
        print('列表元素的下标越界或格式不正确,请输入正确的字符串序号')
    else:
        break

7、带有多个except的try结构

'''
带有多个except的try结构
'''
while True:
    try:
        x = input('请输入被除数:')
        y = input('请输入除数:')
        z = float(x) / float(y)
    except ZeroDivisionError:
        print('除数不能为0')
    except ValueError:
        print('被除数和除数应该为数值类型')
    except NameError:
        print('变量不存在')
    else:
        print(x, '/', y, '=', z)
        break

8、将要捕获的异常写再一个元组中,可以是用一个except语句捕获多个异常 并且共用一段异常处理代码

'''
将要捕获的异常写再一个元组中,可以是用一个except语句捕获多个异常
并且共用一段异常处理代码
'''
try:
    f = open('myflie.txt')
    s = f.readline()
    i = int(s.strip())
except (OSError,ValueError,RuntimeError,NameError):
    print('报错')

9、try……except……else……finally……结构 finally语句块,无论是否出现异常都会执行

'''
try……except……else……finally……结构
finally语句块,无论是否出现异常都会执行
'''
def divide(x,y):
    try:
        result = x/y
    except ZeroDivisionError:
        print("division by zero")
    else:
        print('结果:',result)
    finally:
        print('无论怎样我都会执行,气死你')
divide(3,0)
divide('3','1')

10、如果文件不存在,而导致文件对象创建失败,从而导致文件不能正常关闭 那么再finally,也会抛出异常

'''
如果文件不存在,而导致文件对象创建失败,从而导致文件不能正常关闭
那么再finally,也会抛出异常
'''
try:
    f = open('tesaft.txt','r')
    line = f.readline()
    print(line)
except: #这种就是,啥子异常都捕捉
    print('出现问题啦!!!')
finally:
    f.close()

11、再使用待用finally子句的异常处理结构的时候 应该尽量避免再finally子句中使用return语句 否则会出现意想不到的错误

'''
再使用待用finally子句的异常处理结构的时候
应该尽量避免再finally子句中使用return语句
否则会出现意想不到的错误
'''
def demo_div(a,b):
    try:
        return a/b
    except:
        print('出错了')
    finally:
        return -1
print(demo_div(1,0))
print(demo_div(1,1))    #好吧,demo_div居然通过finally实现了变卦功能,玩不起

12、断言和异常处理经常结合使用

'''
断言和异常处理经常结合使用
'''
try:
    assert 1==2,'不相等噢'
except AssertionError as reason:
    print("%s:%s"%(reason.__class__.__name__,reason))   #获取错误的名字,获取

13、with文件执行完毕后,会自动关闭

'''
上下文管理
使用上下文管理语句with可以实现自动管理资源
再代码块执行完毕之后自动还原进入该代码块之前的现场或上下文

不论何种原因跳出with块,也无论是否发生异常,总能保证资源
正确被释放,大大简化程序员的工作
常用于文件操作、网络通信、数据库操作、多线程与多线程之类的场合
'''
#文件执行完毕后,会自动关闭
with open('D:\\test.txt') as f:
    for line in f:
        print(line)

来源:python程序设计(第3版)

作者:董付国

posted @ 2023-01-01 11:27  不吃jiumi女孩  阅读(27)  评论(0)    收藏  举报