一、前言
在 python 开发过程中,程序出现错误是非常常见的事情。
例如:
- 用户输入错误的数据
- 文件不存在
- 网络连接失败
- 数据格式不正确
- 除数为0
如果程序没有进行异常处理,一旦出现问题,程序会直接终止运行。
优秀的程序并不是完全避免错误,而是在错误发生时:
能够发现错误、处理错误,并让程序保持稳定运行。
python 提供了一套完善的异常处理机制,可以帮助开发者提高程序的健壮性。
本文将详细介绍 python 异常处理相关知识。
学习目标包括:
- 理解语法错误和异常区别
- 掌握 try-except 捕获异常
- 掌握异常信息获取
- 掌握 else 和 finally
- 掌握 raise 主动抛出异常
- 掌握 assert 调试
- 掌握自定义异常类
二、python中的错误类型
python程序中的错误主要分为两大类:
- 语法错误
- 异常
两者虽然都会导致程序无法正常执行,但是产生阶段完全不同。
1. 语法错误(syntax error)
什么是语法错误?
语法错误指:
程序代码不符合 python 语法规则,在解析阶段就被发现的问题。
特点:
- 程序还没有开始运行
- 解释器无法解析代码
- 必须修改代码才能执行
例如:
if a == 1
print(a)
错误原因:
python要求:
if 条件:
后面必须添加冒号。
运行:
syntaxerror: expected ':'
常见语法错误:
- 少写冒号
- 引号没有闭合
- 缩进错误
- 关键字拼写错误
2. 异常(exception)
什么是异常?
异常指:
程序语法正确,可以运行,但是执行过程中发生错误。
例如:
list = [1,2,3] print(list[3])
代码没有语法问题。
但是:
列表索引只有:
0 1 2
访问:
3
不存在。
产生:
indexerror: list index out of range
三、为什么需要异常处理?
默认情况下:
如果程序发生异常:
python会:
- 停止程序运行
- 输出错误信息
例如:
print(10/0)
结果:
zerodivisionerror
但是实际项目中:
我们希望:
- 给用户友好提示
- 保存错误日志
- 释放资源
- 继续运行程序
所以需要:异常处理机制
异常处理的目的:
不是消灭错误,而是在错误发生时提供合理解决方案。
四、try-except捕获异常
python中最基础的异常处理结构:
try:
可能发生异常的代码
except:
异常处理代码
执行流程:
没有异常
执行:
try代码
↓
跳过except
↓
继续执行
发生异常
执行:
try代码
↓
发生错误
↓
执行except
↓
继续程序
案例
try:
result = 10 / 0
except:
print("程序出现异常")
print("程序继续执行")
输出:
程序出现异常
程序继续执行
这样程序不会直接崩溃。
五、捕获指定异常
虽然:
except:
简单。
但是:
它会捕获所有异常。
实际开发更推荐:
精准捕获。
例如:
try:
num = 10 / 0
except zerodivisionerror:
print("不能除以0")
获取异常信息
使用:
as e
例如:
try:
print(10/0)
except zerodivisionerror as e:
print(e)
输出:
division by zero
六、多异常处理
一个程序可能产生不同错误。
例如:
try:
a = int(input())
except valueerror:
print("输入不是数字")
except typeerror:
print("类型错误")
python会按照顺序匹配。
注意:
通配异常:
except:
必须放最后。
否则:
会提前捕获所有异常。
七、else子句
try-except还有一个可选结构:
else
作用:
try没有异常时执行。
格式:
try:
代码
except:
异常处理
else:
正常执行
案例:
try:
result = 10 / 2
except:
print("错误")
else:
print(result)
输出:
5
else可以让代码结构更加清晰:
- try处理风险代码
- except处理错误
- else处理成功结果
八、finally:无论如何都会执行
finally特点:
无论是否发生异常,都会执行。
格式:
try:
代码
except:
处理异常
finally:
必执行代码
常见用途:
- 关闭文件
- 关闭数据库
- 释放锁
- 清理资源
例如:
try:
file=open("test.txt")
finally:
file.close()
九、raise主动抛出异常
除了python自动产生异常:
开发者也可以主动制造异常。
使用:
raise
例如:
def login(password):
if password != "123456":
raise valueerror("密码错误")
调用:
login("111")
结果:
valueerror: 密码错误
常用于:
- 参数校验
- 业务规则检查
- 数据验证
十、assert断言
assert用于:
判断程序是否满足预期条件。
格式:
assert 条件,提示信息
例如:
age=10 assert age>=18,"年龄不符合要求"
如果条件失败:
产生:
assertionerror
适合:
- 开发调试
- 检查程序逻辑
不适合作为正式业务异常处理。
十一、自定义异常
python提供很多异常:
例如:
- valueerror
- typeerror
- indexerror
但是业务开发中:
可能需要:
- 用户不存在
- 余额不足
- 权限不足
这时候可以创建自己的异常。
创建自定义异常
class usererror(exception):
pass
必须继承:
exception
使用自定义异常
class usernotfounderror(exception):
pass
def find_user(name):
users=["admin"]
if name not in users:
raise usernotfounderror("用户不存在")
捕获:
try:
find_user("tom")
except usernotfounderror as e:
print(e)
十二、with上下文管理器
在开发中:
经常操作资源:
例如:
- 文件
- 数据库
- 网络连接
资源使用后必须释放。
python提供:
with
自动管理资源。
例如打开文件:
传统方式:
file=open("a.txt")
file.close()
如果中途异常:
可能无法关闭。
with方式:
with open("a.txt") as f:
data=f.read()
代码结束:
python自动关闭文件。
with本质:
try + finally
十三、python常见异常类型
| 异常 | 说明 |
|---|---|
| valueerror | 值错误 |
| typeerror | 类型错误 |
| nameerror | 变量不存在 |
| indexerror | 索引越界 |
| keyerror | 字典不存在键 |
| zerodivisionerror | 除数为0 |
| attributeerror | 属性错误 |
| filenotfounderror | 文件不存在 |
| syntaxerror | 语法错误 |
十四、实际开发中的异常处理原则
1. 不要随便捕获所有异常
不推荐:
except:
pass
因为:
错误会被隐藏。
2. 精准捕获异常
推荐:
except valueerror:
而不是:
except:
3. 资源必须释放
推荐:
with open()
或者:
finally
4. 自定义异常贴合业务
例如:
passworderror usernotfounderror permissionerror
让错误更加容易理解。
十五、总结
python异常处理核心知识:
| 知识点 | 作用 |
|---|---|
| 语法错误 | 代码规则错误 |
| 异常 | 运行过程错误 |
| try-except | 捕获异常 |
| except as | 获取错误信息 |
| else | 成功执行逻辑 |
| finally | 资源释放 |
| raise | 主动抛异常 |
| assert | 调试检查 |
| 自定义异常 | 业务错误 |
| with | 自动管理资源 |
掌握异常处理,是 python 从入门走向实际开发的重要一步。
在真实项目中:一个优秀程序不仅要实现功能,更要能够正确面对各种异常情况。
以上就是python异常处理机制之常见异常类型与方法详解的详细内容,更多关于python异常处理的资料请关注代码网其它相关文章!
发表评论