Python基础——异常处理
一、异常的基本概念
1、什么是异常
分为编译异常和运行时异常。
编译异常:
代码缺少冒号、没有缩进,在编写时就会提示的错误。
运行时异常:
程序运行过程中出现的错误,会中断程序的正常执行流程。
例如:
num = int(input("请输入一个整数:"))
print(f"{num}是一个整数")
输入非整数:1.1
运行结果

2、异常处理的作用
防止程序直接崩溃: 程序遇到错误后,确保后面的代码正常执行。
区分异常类型: 捕获不同类型的异常,针对性处理。
便于调试: 打印错误信息,能够让我们更快的找到 bug。
二、异常处理的基本语法
1、核心语法:try…expect语句
try:
# 可能会出错的代码
except 异常类型:
# 出错之后要执行的代码
当然,我们也可以在输出具体的异常信息,代码如下。
try:
# 可能会出错的代码
except 异常类型 as e:
# 出错之后要执行的代码
# as e 可以把捕获到的错误信息保存到变量 e 中
print("出现错误:{e}")
2、多异常捕获
一段代码可能会出现多种类型的异常,可以用多个 except 语句进行处理。
分开捕获(最常用):每个异常单独进行处理。
try:
num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
count = num1 / num2
print(f"结果是:{count}")
except ValueError:
print(f"输入异常!请输入一个数字!")
except ZeroDivisionError:
print(f"除数不能为0!")
合并捕获 :把异常写在元组里 (异常1, 异常2)。
try:
num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
count = num1 / num2
print(f"结果是:{count}")
except (ValueError, ZeroDivisionError) as e:
print(f"输入异常!请输入一个数字! 或 除数不能为0!{e}")
3、常见的异常类型
SyntaxError : 代码不符合 Python 语法,比如少写冒号、括号不匹配。
IndentationError : 缩进错误
NameError 名称错误: 访问了没定义的变量 / 函数名。
TypeError 类型错误: 操作 / 函数传入了不兼容的类型,比如字符串和数字相加。
IndexError 索引错误: 列表 / 字符串等序列的索引超出了范围。
KeyError 键错误: 在字典中访问了不存在的键。
ValueError 值错误: 传入的参数类型对,但值无效,比如把非数字字符串转成整数。
AttributeError 属性错误: 访问对象不存在的属性或方法。
ZeroDivisionError 除零错误: 除数为0
FileNotFoundError 文件未找到错误: 尝试打开一个不存在的文件。
ImportError 导入错误: 导入模块 / 包失败,比如模块路径错误或未安装。
KeyboardInterrupt 用户中断错误: 用户按Ctrl+C手动中断程序执行。
RuntimeError 运行时错误: 其他未明确分类的运行时错误,比如迭代器修改时的异常。
三、异常处理的扩展
1、else语句和finally语句
try+expect+else语句: 当try块中代码无异常时,才会执行else块中的内容;若有异常,else块会被跳过(不执行)。
try:
num = int(input("请输入一个整数:"))
except ValueError as e:
print(f"输入的不是整数!异常信息:{e}")
else:
print(f"程序成功运行,{num}是一个整数")
没有异常的运行结果:
出现异常的运行结果:
try+expect+finally语句: 无论try块是否出现异常、except块是否执行,finally块中的内容都会被执行。常用于关闭文件、释放资源:
f = None
try:
f = open("bak.txt", "r", encoding='utf-8')
data = f.read()
print(f"文件的内容为:{data}")
except FileNotFoundError:
print("文件不存在")
finally:
if f:
f.close()
print("文件已关闭")
正常运行结果:
出现异常的运行结果:
注意: else和finally语句可以同时使用,但else语句必须在expect语句之 后,fina语句之前
2、分级捕获
在Python的异常处理中,先捕获具体的子类异常,再捕获通用的父类异常。
子类异常: 范围小,知道具体的错误类型。
try:
num1 = int(input("请输入第一个整数:"))
num2 = int(input("请输入第二个整数:"))
count = num1/num2
print(f"结果是:{count}")
except ValueError:
print("必须输入整数!")
except ZeroDivisionError:
print("除数不能为0!")
运行示例:
父类异常: 范围广,能捕获所有子类异常,用来兜底。
try:
num1 = int(input("请输入第一个整数:"))
num2 = int(input("请输入第二个整数:"))
count = num1/num2
print(f"结果是:{count}")
except Exception as e:
print(f"程序出现异常 异常信息:{e}")
错误输入的运行结果示例:


注意: 父类异常能捕获所有子类异常,可以同时使用,但父类异常必须在所有子类异常后使用。
错误示例: 父类异常在前,会直接覆盖子类异常,子类异常永远不会执行。
try:
num1 = int(input("请输入第一个整数:"))
num2 = int(input("请输入第二个整数:"))
count = num1/num2
print(f"结果是:{count}")
except Exception as e:
print(f"程序出现异常 异常信息:{e}")
except ZeroDivisionError:
print("除数不能为0!")

四、总结
- Python异常分语法错误和运行时异常,作用是防止程序崩溃、方便调试排错。
- 核心用
try...except捕获异常,支持单独捕获、合并捕获,as e可查看错误详情。 - 熟记常见内置异常,对应不同代码报错场景。
else无异常执行正常逻辑,finally无论是否报错都执行,用于释放资源。- 异常有父子层级:子类精准具体,父类范围宽泛;分级捕获需先子类、后父类,避免顺序颠倒导致子类失效,让代码更健壮容错。
更多推荐


所有评论(0)