Python学习笔记之异常处理

本文深入讲解了Python中的异常处理机制,包括常见异常类型如AttributeError、OSError等,以及如何使用try-except、finally等语句进行异常捕获和处理。同时介绍了如何通过raise抛出异常,以及获取和处理异常信息的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、认识异常:
  • 首先语法错误不是异常;
  • 在程序运行中没有考虑到或者不可预见的事件导致出现错误;
  • 好比:你和家人计划在周末去郊外野炊,周末到达郊外准备野炊时突然下起了倾盆大雨。
  • 为增强程序的健壮性,程序的编写需要考虑如何处理这些异常情况;
  • Python语言提供了异常处理功能。
  • 常见的异常,Python有很多,常见的有这样几个
    1.AttributeError 异常:
    试图访问一个类中不存在的成员(包括:成员变量、属性和成员方法)而引发的异常。
    2.OSError 异常:
    是操作系统相关异常。在Python3.3版本后IOError(输入输出异常)也并入到OSError异常;所以输入输出异常也属于OSError异常。例如"未找到文件"或"磁盘已满"异常。
    3.IndexError 异常:
    是访问序列元素时,下标索引超出取值范围所引发的异常。
    4.KeyError 异常:
    是试图访问字典里不存在的键时而引发的异常。
    5.NameError 异常:
    是试图使用一个不存在的变量而引发的异常。
    6.TypeError 异常:
    是试图传入变量类型与要求的不符合时而引发的异常。
    7.ValueError 异常:
    是由于传入一个无效的参数值而引发的异常。
二、使用条件选择处理异常
  • 我可以用条件选择的方法如 if input.isdigit() ,对异常进行处理,但是在写程序时候,不可能把所有异常的可能都想到;就好比你在野炊之前,观察天气预报或者准备防雨措施,但还有很多不可预见的事件,事物发展有很多的不确定因素~!
三、异常处理的介绍
  • 如何程序不进行异常处理,当程序遇到异常的时候,程序会终止运行(强行退出)。
  • 异常处理:当出现异常的时候,会告诉用户或者开发者出现了异常,并不影响程序的继续运行。
  • 异常处理在代码中主要有两种方法:异常捕获、抛出异常;
    异常捕获有四种形式:
    1.try—except
    2.try—except—else
    3.try—except—finally
    4.try—except—else—finally
    抛出异常:
    使用raise关键字来抛出。
四 、获取异常的信息
list01 = [11, 22, 33, 44, 55, 66, 77]
try:
    print(list01[10])
except Exception as e:
    print("出现异常错误")
    print(str(e))     # 反馈异常的基本信息
    print(e)          # 反馈异常的基本信息
    print(e.args[0])  # 反馈异常的基本信息
    print(repr(e))    # 反馈异常的类型和异常的基本信息
    # 反馈更详细的信息,需要引入 import traceback
    print(traceback.format_exc())  # 反馈异常的详细信息
    # 写入文件 traceback.print_exc(file=open("文件目录文件名", "w"是写入参数))
    traceback.print_exc(file=open("e:\\Exception.ini", "w"))
五、 捕获异常:

1.try—except

  • try: 有可能出现异常的代码
  • except: 如果出现异常所执行的代码

实现方式一

num01 = int(input("请输入一个整数: "))
num02 = int(input("请输入再一个整数: "))
try:
    print("%d / %d = %.2f"%(num01, num02, num01 / num02))
except:
    # 方式1.基本方式:只显示提示信息
    print("代码出现异常")
    # 方式2:客户方式,显示提示信息,将异常信息保存日志文件
    print("代码出现异常,请联系管理员")
    traceback.print_exc(file=("e:\\error.ini", "w"))
# 方式3,开发者方式,显示异常信息
except Exception as e:
    print(str(e))     # 反馈异常的基本信息
    print(repr(e))    # 反馈异常的类型和异常的基本信息
    print(traceback.format_exc())  # 反馈异常的详细信息

实现方式二

num01 = int(input("请输入一个整数: "))
num02 = int(input("请输入再一个整数: "))
try:
    print("%d / %d = %.2f"%(num01, num02, num01 / num02))
except ValueError as e:  # 依据具体的异常类
    print("输入的不是整数")
except ZeroDivisionError as e:  # 依据具体的异常类
    print("除数不能为零")
except Exception as e:  # 通用类~!
    print("未知的异常,具体参看日志文件")
    traceback.print_exc(file=("e:\\error.ini", "w"))
  • 关于 try–except–else
    try: 可能出现异常的代码
    except: 如果出现异常执行的代码
    else: 如果没有出现异常执行的代码
  • 关于 try–except–finally
    try: 可能出现异常的代码
    except: 如果出现异常执行的代码
    finally: 无论是否出现异常都会执行的代码
  • 关于 try–except–else–finally
    try: 可能出现异常的代码
    except: 如果出现异常执行的代码
    else: 如果没有出现异常执行的代码
    finally: 无论是否出现异常都会执行的代码
    无论try中的代码是否有异常,finally中的代码都会被执行!
    finally代码主要对资源的回收:打开文件的关闭或者打开数据之后的关闭连接
num01 = int(input("请输入一个整数: "))
num02 = int(input("请输入再一个整数: "))
try:
    print("%d / %d = %.2f" % (num01, num02, num01 / num02))
except ValueError as e:
    print("输入的不是整数")
except ZeroDivisionError as e:
    print("除数不能为零")
except Exception as e:
    print("未知的异常,具体参看日志文件")
    traceback.print_exc(file=("e:\\error.ini", "w"))
else:
    print("这个是else的代码")
finally:
    print("这个是finally的代码")

这里要强调 finally 主要用于打开资源的回收

学习案例《读取文件数据》(代码有问题尚待解决)
try:
    global fd  # global在函数内将变量定义为全局变量,在函数内部使用。
    fd = open("d:\\python\\project\\dome\\staff.csv")
    print(fd.read())
except FileNotFoundError as e:
    print("文件的路径或者名称错误!")
except UnicodeDecodeError as e:
    print("编码无法识别!")
except Exception as e:
    print("未知的异常,具体参看日志文件")
    traceback.print_exc(file=("e:\\error.ini", "w"))
finally:
    fd.close()

案例中用到的global是将函数内的变量定义为全局变量。在函数内使用。

六、抛出异常 raise
学习案例:输入两个0-1000之间的整数,求和差积商
def div_number(num01:int, num02:int):
    if num01 < 0 or num01 > 1000 or num02 < 0 or num02 > 1000:
        raise Exception("输入的值不在范围内")
    try:
        return num01 / num02
    except ZeroDivisionError as e:
        raise e


def add_number(num01:int, num02:int):
    return num01 + num02


if __name__ == "__main__":
    try:
        num01 = int(input("输入一个0-1000之间的整数 "))
        num02 = int(input("输入一个0-1000之间的整数 "))
        print("%d / %d = %d" % (num01, num02, div_number(num01, num02)))
        print("%d + %d = %d" % (num01, num02, add_number(num01, num02)))
    except ValueError as e:
        print("输入的不是数字")
    except ZeroDivisionError as e:
        print("除数不能是0")
    except Exception as e:
        print(e)

学海无涯苦作舟,慢慢行来慢慢行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值