Python异常处理
本文主要介绍了Python中异常处理问题,主要内容有了解异常、异常的捕获方法、异常的传递。
了解异常
什么是异常
当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG
bug单词的诞生
早期计算机采用大量继电器工作,马克二型计算机就是这样的。
1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试了很多办法,最后定位到第70号继电器出错。负责人哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布帖到“事件记录本”中,并注明“第一个发现虫子的实例。”自此之后,引发软件失效的缺陷,便被称为Bug。
异常演示
例如:以`r`方式打开一个不存在的文件。
f = open('linux.txt', 'r')
执行结果:
常见的异常
示例:
# NameError、IndexError、KeyError、TypeError
print(12 + '12') # TypeError: unsupported operand type(s) for +: 'int' and 'str'
print('12' + 12) # TypeError: can only concatenate str (not "int") to str
dict1 = {
"key1": 123,
"key2": 321
}
print(dict1["key3"]) # KeyError: 'key3'
print(a) # NameError: name 'a' is not defined
总结
1. 什么是异常:
异常就是程序运行的过程中出现了错误
2. bug是什么意思:
bug就是指异常的意思,因为历史因为小虫子导致计算机失灵的案例,所以延续至今,bug就代表软件出现错误。
异常指是Python程序发生的不正常事件,异常可称为错误
当检测到一个错误时,Python解释器就无法正常继续工作,会出现一些错误提示信息,这些信息就叫做异常信息,这就是我们常说的bug。
通常情况下Python中的异常的名称是以Error结尾
异常的捕获方法
为什么要捕获异常
世界上没有完美的程序,任何程序在运行的过程中,都有可能出现:异常,也就是出现bug 导致程序无法完美运行下去。
我们要做的,不是力求程序完美运行。
而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理。
这种行为我们称之为:异常处理(捕获异常)
为什么需要捕获异常
当我们的程序遇到了BUG, 那么接下来有两种情况:
① 整个程序因为一个BUG停止运行
② 对BUG进行提醒, 整个程序继续运行
显然在之前的学习中, 我们所有的程序遇到BUG就会出现①的这种情况, 也就是整个程序直接奔溃. 但是在真实工作中, 我们肯定不能因为一个小的BUG就让整个程序全部奔溃, 也就是我们希望的是达到② 的这种情况 那这里我们就需要使用到捕获异常
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。
捕获常规异常
基本语法:
快速入门
需求:尝试以`r`模式打开文件,如果文件不存在,则以`w`方式打开。
捕获指定异常
基本语法:
注意事项
① 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
② 一般try下方只放一行尝试执行的代码。
示例:
# 创建一个列表
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 制造一个IndexError
try:
print(list1[10])
except IndexError:
print("发生了异常")
print("Holle World")
捕获多个异常
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用元组的方式进行书写。
执行结果:
示例:
# 创建一个列表
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 创建一个列表
dict1 = {}
# 建议在try中只写一行代码
try:
print(list1[9]) # IndexError
print(dict1['key1']) # KeyError
except (IndexError, KeyError) as e:
# e此时就是异常信息
print(f"发生了{e}的异常")
总结:
当捕获多个异常时,可以将多个异常使用元组形式存入
捕获异常并输出描述信息
基本语法:
try:
print(1/0)
except (NameError,ZeroDivisionError) as e:
print(e)
执行结果:
捕获所有异常
基本语法:
执行结果:
示例:
# 创建一个列表
data = [1, 2, 3, 4, 5, 6, 7, 8]
# 创建一个字典
dict1 = {}
# 建议在try中只写一行代码
try:
# print(data[3] / 0) # IndexError
print(dict1['key1']) # KeyError
except Exception as e:
# e此时就是异常信息
print(f"发生了{e}的异常")
总结
在捕获异常的三种方式中,捕获所有异常方式是最简洁高效
在实际开发中,推荐使用捕获所有异常来处理所有有可能发生异常的代码
异常else
else表示的是如果没有异常要执行的代码。
执行结果:
异常的finally
finally表示的是无论是否异常都要执行的代码,例如关闭文件。
示例:
# 创建一个列表
data = [1, 2, 3, 4, 5, 6, 7, 8]
# 创建一个字典
dict1 = {}
try:
print(data[5])
except IndexError as e:
print(f"发生了异常:{e}")
else:
print("程序正常运行")
finally:
print("无论有没有异常都会执行")
总结
1. 为什么要捕获异常?
在可能发生异常的地方,进行捕获。当异常出现的时候,提供解决方式,而不是任由其导致程序无法运行。
2. 捕获异常的语法?
3. 如何捕获所有异常?
异常的种类多种多样,如果想要不管什么类型的异常都能捕获到,那么使用:
except:
except Exception:
两种方式捕获全部的异常
关键字else:表示当程序不发生异常时要执行的代码
关键字finally:表示程序无论发不发生异常时都会执行的代码,可以用于一些必须要完成的操作,比如关闭文件、关闭系统资源等操作
异常的传递
异常的传递
异常是具有传递性的
当函数func01中发生异常, 并且没有捕获处理这个异常的时候, 异常 会传递到函数func02, 当func02也没有捕获处理这个异常的时候 main函数会捕获这个异常, 这就是异常的传递性.
提示:
当所有函数都没有捕获异常的时候, 程序就会报错
利用异常具有传递性的特点, 当我们想要保证程序不会因为异常崩溃的时候, 就可以在main函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都 会传递到main函数中, 这样就可以确保所有的异常都会被捕获
示例:
# 定义一个列表
list1 = [1, 2, 3, 4, 5]
# 定义函数func1
def func1():
print("这是func1开始---------------")
# try:
# print(list1[3] + '4')
# except TypeError as e:
# print(f"在func1中发生了异常,异常信息为:{e}")
print(list1[3] + '4')
print("这是func1结束---------------")
# 定义函数func2
def func2():
print("这是func2开始---------------")
func1()
print("这是func2结束---------------")
if __name__ == '__main__':
try:
func2()
except Exception as e:
print(f"在main函数中发生了异常,异常信息为:{e}")
总结:
当一段代码可能会发生异常时,我们需要进行异常的捕获,当代码之间有嵌套时,异常会从里向外传递
如果我们在最外层代码进行异常捕获,可以捕获到所有的代码异常,一般用Exception

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)