Python学习_基础_34_异常处理

Python学习-异常处理

一、基本概念

什么是异常?

异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止。

异常的三大组成部分
  • 异常的追踪信息
  • 异常的类型
  • 异常的内容

在这里插入图片描述

为何处理异常?

本来程序一旦出现异常就整体结束掉了,有了异常处理以后,在遇到错误时就会有相应的处理机制不会任由程序崩溃掉。而且我们要捕捉异常并处理,将出错信息记录到日志内。

二、如何处理异常

语法上的错误:SyntaxError

有错改错,不再赘述。

逻辑上的错误

常见逻辑错误如下:
# TypeError:数字类型无法与字符串类型相加
1+2# ValueError:当字符串包含有非数字的值时,无法转成int类型
num=input(">>: ") #输入hello
int(num)

# NameError:引用了一个不存在的名字x,没有定义
x

# IndexError:索引超出列表的限制
l=['a','b']
l[99]

# KeyError:引用了一个不存在的key
dic={'name':'山炮'}
dic['sex']

# AttributeError:引用的属性不存在
class test:
    pass

test.x

# ZeroDivisionError:除数不能为0
1/0

针对逻辑上的异常又分成两种,每一种对应不同的处理方式。

  • 错误发生的条件是可以预知

    使用if判断来解决

    案例:猜年龄

    while (True):
        age = input('>>: ').strip()
        if age.isdigit():  # 输入的只要不是数字就会出错
            age = int(age)
            if age > 18:
                print('猜大了')
            elif age < 18:
                print('猜小了')
            else:
                print('猜对了')
                break
        else:
            print('必须输入数字')
    
  • 错误发生的条件是无法预知

    使用try-except来解决,基本格式如下:

    try:
        被检测的代码块  # 有可能抛出异常的代码
    except 异常类型:
        检测到异常,就执行这个位置的代码
    

    如果我们想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配。像下面这样:

    try:
        被检测的代码块
    except (异常类型1,异常类型2,异常类型3):
        触发类型1或类型2或类型3异常时对应的处理逻辑
    

    完全扩展格式如下:

    try:
        # 有可能会抛出异常的代码
        子代码1
        子代码2
        子代码3
    except 异常类型1 as e:
        触发类型1异常时对应的处理逻辑
    except 异常类型2 as e:
        触发类型2异常时对应的处理逻辑
    ...
    else:
        如果被检测的子代码块没有异常发生,则会执行else的子代码
    finally:
        无论被检测的子代码块有无异常发生,都会执行finally的子代码  # 因此通常在finally的子代码块做一些回收资源的操作,比如关闭打开的文件、关闭数据库连接等
    

    而如果我们想捕获所有异常并用同一种逻辑处理,Python提供了一个万能异常类型:Exception

    try:
        被检测的代码块
    except NameError:
        触发NameError时对应的处理逻辑
    except IndexError:
        触发IndexError时对应的处理逻辑
    except Exception:
        其他类型的异常统一用此处的逻辑处理
    

    在这里插入图片描述

    因为错误发生条件无法预知的这种异常情况不易说明,我们以普通的语法错误来举例说明try-except的使用。

    例一:🖋🖋🖋

    print('程序开始运行')
    
    try:
        print('进入try:')
        l = ['a', 'b']
        print(l[3])  # 抛出异常IndexError,该行代码同级别的后续代码不会运行
        print(x)
        print('出了try')
    
    except IndexError as e:
        print('异常的信息: ', e)
    
    print('程序结束运行')
    
    # 运行结果如下:
    
    # 程序开始运行
    # 进入try:
    # 异常的信息:  list index out of range
    # 程序结束运行
    

    我们可以看到,程序在运行至print(l[3])处捕捉到异常IndexError并进行处理,但tryprint(l[3])后续代码不再被执行。

    例二:🖌🖌🖌

    print('程序开始运行')
    
    try:
        print('进入try:')
        print(x)  # 抛出异常,该行代码同级别的后续代码不会运行
        print('出了try')
    
    except Exception:
        print('万能异常捕捉')
    
    print('程序结束运行')
    
    # 运行结果如下:
    
    # 程序开始运行
    # 进入try:
    # 万能异常捕捉
    # 程序结束运行
    

    例三:🖍🖍🖍 else不能单独try配合使用,必须要搭配except

    print('程序开始运行')
    
    try:
        print('进入try:')
        # print(x)
        print('出了try')
    
    except Exception:
        print('万能异常捕捉')
    else:
        print('风平浪静,无事发生')
    print('程序结束运行')
    
    # 运行结果如下:
    
    # 程序开始运行
    # 进入try:
    # 出了try
    # 风平浪静,无事发生
    # 程序结束运行
    

    例四:✏✏✏ finally可以单独try配合使用

    print('程序开始运行')
    
    try:
        print('进入try:')
        # print(x)  # 异常报错:NameError: name 'x' is not defined
        print('出了try')
    
    finally:  # 无论是否发生异常,都会执行finally的子代码
        print('回收垃圾,从你我做起')
    
    print('程序结束运行')
    
    # 运行结果如下:
    
    # 程序开始运行
    # 进入try:
    # 出了try
    # 回收垃圾,从你我做起
    # 程序结束运行
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值