python 异常处理

  • 异常 exception

    什么是错误
        错误是指由于逻辑或语法等导致一个程序无法正常执行的问题

    什么是异常
        异常是程序出错时标识的一种状态
        当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态
        作用:
            用作信号,通知上层调用者有错误产生需要处理

    try语句的两种用法:
        try-except语句
        try-finally语句

        try-except语法:
            try:
                可能触发异常的语法
            except 错误类型1[as 变量1]:
                异常处理语句1
            except 错误类型2[as 变量2]:
                异常处理语句2
            except 错误类型3[错误类型3,错误类型4]:
                异常处理语句3
            ....
            except:
                异常处理语句 other
            else:
                未发生异常语句
            finally:
                最终语句

            示例

def div_apple(n):
    print("%d个苹果您想分给几个人?"%n)
    s = input("请输入人数:")
    cnt = int(s)   #<<-可能触发valueerror错误进入异常->>
    result = n / cnt #<<-可能触发zerodivisionerror错误->>
    print('每个人分了',result,'个苹果')

try:
    div_apple(10)
    print("分苹果完成")
except (ValueError,ZeroDivisionError) as err:  
    print("错误的值是:",err) #err绑定错误对象
else:  #只有在try没有错误时才会执行
    print("在当强前try语句的内部没有发生任何异常,程序走正常流程")
finally:
    #finally 子句的语句无论是正常流程还是异常流程都会被执行
    print("我这条语句一定会执行")

print('程序正常退出')

     
        语法说明:

            as 子句是用于绑定错误对象的变量,可以省略
            except 子句可以有一个或多个,但至少要有一个
            else 子句最多只能有一个,也可以省略不写
            finally 子句最多只能有一个,可以省略

        作用:
            尝试捕获异常(接受异常通知),将程序转为正常状态并继续执行
        示例:
        练习:
            写一个函数 get_score()来获取学生输入成绩(0-100的整数)
            输入如果出现异常,则让此函数返回0,否则返回用户输入的成

        注:
            try_except语句也可以放在函数内部使用


def get_score():
        s = int(input("请输入整数(0~100):"))
        if s > 100 or s <0:
            return 0
        else:

            return s

#方法1,在调用的地方加入异常处理语句,然后进行处理
try:
    score = get_score()
    
except ValueError:
    score = 0
    print("在try的内部语句中发生了值错误,已处理并转为正常状态")


print("此学生的成绩是:",score)

方法2,在函数内部有可能抛出异常的地方加上try-except语句
def get_score():        
        try:
            s = int(input("请输入整数(0~100):"))
        except ValueError:
            return 0
            print("在try的内部语句中发生了值错误,已处理并转为正常状态")
        if s > 100 or s <0:
            return 0
        else:
            return s


score = get_score()
print("此学生的成绩是:",score)
  •     try-finally语句

        语法:
            try:
                可能触发异常的语句
            finally:
                最终语句
        说明:
            finally子句不可以省略
            一定不存在ecxept子句
        作用:
            通常用try-finally语句来左触发异常时必须要处理的事情,无论异常是否发生,finally子句都会
            被执行,try-finally语句不会改变程序的(正常/异常状态)

        示例:  

def fry_egg():
    print("打开天然气....")
    try:
        count = int(input("请输入鸡蛋个数:"))
        print('完成煎鸡蛋,共煎了%d个鸡蛋'%count)
    finally:
        print("关闭天然气")
try:
    fry_egg()
except:
    print("程序出现过异常,已经转为正常状态")
        
print("程序正常退出")()

    try语句嵌套:
        try嵌套是指一个try语句嵌套在另一个try语句内使用
        示例:

try:
    try:
        n = int(input("请输入整数:"))
    except ValueError:
        print("在内层try语句内出像值错误,已转为正常状态")
    else:
        print("内存try语句没有出现异常")

except:
    print("外层的try语句接收到的异常通知,已处理并转为正常状态")
else:
    print("外层的try语句没有出现异常")
  •     raise语句;

        作用:
            触发一个错误,让程序进入异常状态
            发送错误通知给调用者
        语法:
            raise 异常类型
            或
            raise 异常对象
            或
            raise #重新触发上一次异常

        示例:

def make_except():
    print("开始")
    # raise ValueError  #故意发送一个错误通知
    e = ValueError("这是一个故意制作的错误")
    raise e
    print("结束")
try:
    make_except()
except ValueError as err: #err绑定ValueError
    print("make_except 发出了ValueError类型的错误,已捕获")
    #错误的原因如何获得
    print("错误的值是:",err)

print("程序结束")

练习:
        写一个函数get_age()用来获取一个人的年龄信息
            此函数规定用户只能输入1-140之间的整数,如果用户输入其他的数则直接触发ValueError类型的错误来通知调用者
 

def get_age():
    a = int(input("请输入一个整数(1-140之间):"))
    if a > 140 or a < 1:
        raise ValueError

    return a
try:
    age = get_age()
    print("用户输入的年龄是:",age)
except ValueError as err:
    print("用户输入的不是1-140的整数,获取年龄失败!")
  • assert语句(断言语句)

        语法:
            assert 真值表达式,错误数据(通常是字符串)

        作用:
            当真值表达式为False时,用错误数据创建一个AssertiionError类型
            的错误raise出去,并进入异常状态

        等同于:
            if 真值表达式 == False:
                raise AssertionError (错误数据)

        示例:
         

def get_score():
    s = int(input("请输入学生成绩(0-100):"))
    # assert 0 <= s <= 100,'成绩超出范围!'
    if (0 <= s <= 100) == False:
        raise AssertionError("成绩超出范围")
        
    return s


try:
    score = get_score()
    print("学生成绩为:",score)
except ValueError:
    print("用户输入的数字不能转化为整数...")
except AssertionError:
    print("用户输入的整数不在0-100之间...")

异常(高级)

  •     with 语句

        语法:
            with 表达式1[as 变量1],表达式2[as 变量2],......
                语句块
        作用:
        使用于对资源进行访问的场合,确保使用过程中不管是否发生异常都会执行必须的'清理'操作,并释放资源
            如:
                文件打开后自动关闭,线程中锁的自动获取和释放等()
            说明:
                as子句中的变量用于绑定表达式执行后生成的对象,with语句并不会改变异常的状态
        示例:
        

# with.py
#用try_finally来保证文件一定能正常关闭
try:
    f = open('../../第五周笔记/python基础-20.txt')
    try:
        for l in f:
            print(l)
    finally:
        f.close()
        print('文件已经关闭')
except OSError:
    print('打开文件失败')

#用with语句保证文件一定能够关闭
try:
    with open('../../第五周笔记/python基础-20.txt') as f:
        for l in f:
            x = int('aaa') #当进入异常时,打开的文件也能够关闭
            print(l)

except OSError:
    print('打开文件失败')


       环境资源管理器:
        1.类内有__erter__和__exit__实例方法的类的创建的对象被称为环境管理器
        2.能够用with语句进行管理的对象必须是环境管理器
        3.__enter__方法将在进入with语句时被调用由as变量绑定返回的对象
        4.__exit__方法将在离开with语句时被自动调用,且可以通过参数来判断离开with语句是否有异常发生
        示例:

class A:
    '''此类对象可以用于with语句进行管理'''
    def __enter__(self):
        print('此方法实在with语句内')
        return self #self 将被with中的as变量绑定

    def __exit__(self,exc_type,exc_val,exc_tb):
        '''exc_type用来绑定错误类型,当没有发生异常时绑定None
           exc_val用来绑定错误对象,当没有发生异常时绑定None
           exc_tb用来绑定TraceBack追踪,当没有发生异常时绑定None'''
        if exc_type is None:
            print('您已离开with语句,离开时没有任何异常')
        else:
            print('您已离开with语句')
            print('错误类型是:',exc_type)
            print('错误对象是:',exc_val)
            print('Traceback',exc_tb)

with A() as a:
    print('这是with语句内部的输出')
    int(input('请输入整数:'))


print('程序正常结束')


          

  • 为什么要用异常处理机制

         在程序调用层数较空时,向主调函数传递错误信息需要层层return
    返回比较麻烦,所以用异常处理机制

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值