目录
1.异常是什么?
2.异常机制的本质
2.1 本质
2.2 异常对象
2.3 抛出异常
2.4 捕捉异常
2.5 最终处理
3.异常的解决思路
3.1 异常定位
3.2 异常解决
1.异常是什么?
- 异常是指程序在运行时发生的错误或不正常情况。
工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件可能不存在或者文件格式不对;程序在运行 着,但是内存或硬盘可能满了等等。
如下的伪代码:
# 1. 开始程序 开始程序 # 2. 尝试执行可能出错的代码块 尝试: # 执行可能引发异常的操作 打开文件("example.txt") 读取文件内容 关闭文件 # 3. 捕捉和处理异常 捕捉 异常(例如,文件未找到异常): # 如果发生异常,执行此块中的代码 输出 "文件未找到,请检查文件路径" # 4. 无论是否发生异常,都执行的代码 无论如何: # 例如,清理操作,如关闭文件 确保文件已关闭 # 5. 结束程序 结束程序
对应真实Python代码:
try: # 尝试打开并读取文件 with open("example.txt", "r") as file: content = file.read() print(content) except FileNotFoundError: # 如果文件未找到,捕捉异常并输出提示 print("文件未找到,请检查文件路径") finally: # 这个块中的代码无论是否发生异常都会执行 print("操作结束")
try
块中的代码尝试打开一个文件并读取内容。- 如果文件不存在,会引发
FileNotFoundError
异常,except
块会捕捉并处理这个异常。finally
块中的代码无论如何都会执行,例如用于结束操作或资源的清理。2.异常机制的本质
2.1 本质
异常机制的本质是提供一种结构化的方式来处理程序中的错误和不正常情况。这种机制让程序能够在遇到错误时控制程序的行为,而不是简单地终止程序。
2.2 异常对象
python中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。
异常在Python中表示为对象。这些对象继承自内置的
BaseException
类,具体的异常类如FileNotFoundError
、ValueError
等都是从BaseException
派生出来的。每个异常对象携带了错误的信息和错误的上下文,这些信息可以被捕捉和处理。如下展示了python中内建异常类的继承层次:
2.3 抛出异常
当程序检测到错误或需要中断当前操作时,它会“抛出”一个异常。使用
raise
语句可以显式地抛出一个异常。例如:raise ValueError("这是一个值错误")
2.4 捕捉异常
捕捉异常使用
try
和except
语句块。try
块中的代码是程序正常运行的代码,而except
块用于捕捉try
块中抛出的异常。程序在try
块中遇到异常时,会跳转到相应的except
块执行异常处理代码。例如:try: # 可能会抛出异常的代码 result = 10 / 0 except ZeroDivisionError: # 异常处理代码 print("不能除以零")
2.5 最终处理
无论是否发生异常,
finally
块中的代码都会被执行。这通常用于释放资源或执行清理操作,例如关闭文件或网络连接。例如:try: file = open("example.txt", "r") content = file.read() finally: file.close()
3.异常的解决思路
3.1 异常定位
- 当碰到程序异常时,首先查看程序所报的异常错误是什么,然后看程序报的异常信息在哪一行,然后去翻译错误信息,进行修改
- 有些程序可能知道异常,但是代码过多行数定位不那么清晰,也就是说各种函数嵌套的报错这种,比较简单但有点麻烦的方法就是,从报错的函数的或者行数进行打印一些分隔符,例如,报错的是第100行错误,是一个函数报错,那你就定位到这个函数里面,然后选择函数中的一半或者随便在这个函数某个位置进行打印一些东西,再次执行程序,看我们打印的东西是否打印,如果没有打印,那说明,程序没有执行到我们写的打印的位置,到打印的位置之前就已经报错了,然后把打印语句再次往上次的位置之前再放,以此类推,就能定位到某一行的代码错误,如果是函数里面嵌套的函数报错,也是类似的道理,一层一层的进去定位到错误,然后进行修改
3.2 异常解决
- 当你定位到函数的具体错误位置时,就可以根据提示的错误信息,例如参数错误、类型错误等等参数进行调整修改,然后查一下,看所用函数和方法是否正确。
- 如果异常信息比较模糊,你也不理解错误信息,那就将你的错误信息,即报错的最后一行,和定位到的代码所用的函数等,复制到百度去直接搜,因为你碰到的问题,可能别人也碰到过,对于开始学的同学,我们可以把每次碰到的异常信息以及解决的思路去记录下来,这样后面碰到类似的情况,你就能很快去解决。
- 如果你去看错误信息,也不会去改,也搜不到和你同样的错误信息,那就去找你所做的功能逻辑看是否有类似的,看别人是如何写,或者将你的定位的代码以及错误信息去粘贴到chatgpt中去问问,还是不行,那就只能去多问问人了。
- 要注意的一点是,程序异常的排查是比较考验耐心,也是累积经验的比较快的方式。
4.