网站首页 > 技术文章 正文
忘记发这个东西了,要"踹"
异常捕获是 Python 中处理程序运行时错误的重要机制,它允许程序在遇到错误时优雅地处理而不是直接崩溃。下面我将详细介绍 Python 中的异常捕获机制。
1. 异常捕获基本语法
Python 使用 try-except 语句块来捕获和处理异常:
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定异常
print("不能除以零!")
2. 异常捕获的完整结构
完整的异常处理结构包括以下部分:
try:
# 可能引发异常的代码
risky_operation()
except ExceptionType1:
# 处理 ExceptionType1 类型的异常
handle_exception1()
except ExceptionType2 as e:
# 处理 ExceptionType2 类型的异常,并获取异常对象
handle_exception2(e)
else:
# 如果没有异常发生,执行此代码块
no_exceptions_occurred()
finally:
# 无论是否发生异常,都会执行的代码块
always_execute()
3. 常见异常类型
Python 内置了许多异常类型,常见的有:
异常类型 | 描述 |
Exception | 所有内置异常的基类 |
SyntaxError | 语法错误 |
NameError | 未声明/初始化变量 |
TypeError | 操作或函数应用于不适当类型的对象 |
ValueError | 操作或函数接收到类型正确但值不合适的参数 |
IndexError | 序列下标超出范围 |
KeyError | 字典键不存在 |
ZeroDivisionError | 除数为零 |
FileNotFoundError | 文件未找到 |
ImportError | 导入模块/对象失败 |
4. 异常捕获的多种用法
4.1 捕获特定异常
try:
with open('nonexistent.txt') as f:
content = f.read()
except FileNotFoundError:
print("文件不存在!")
4.2 捕获多个异常
try:
# 可能引发多种异常的代码
risky_operation()
except (TypeError, ValueError) as e:
print(f"发生了类型或值错误: {e}")
4.3 捕获所有异常(谨慎使用)
try:
unpredictable_operation()
except Exception as e:
print(f"发生了未知错误: {e}")
4.4 获取异常详细信息
try:
1 / 0
except ZeroDivisionError as e:
print(f"异常类型: {type(e).__name__}")
print(f"异常信息: {str(e)}")
print(f"异常追踪: {e.__traceback__}")
4.5 else 子句的使用
try:
result = safe_operation()
except SomeError:
print("操作失败")
else:
print(f"操作成功,结果为: {result}")
4.6 finally 子句的使用
file = None
try:
file = open('data.txt', 'r')
process(file)
except IOError:
print("文件操作错误")
finally:
if file is not None:
file.close() # 确保文件总是被关闭
5. 主动抛出异常
使用 raise 语句可以主动抛出异常:
def validate_age(age):
if age < 0:
raise ValueError("年龄不能为负数")
if age > 120:
raise ValueError("年龄不合理地大")
return True
try:
validate_age(-5)
except ValueError as e:
print(f"无效年龄: {e}")
6. 自定义异常
可以创建自己的异常类型:
class MyCustomError(Exception):
"""自定义异常类"""
def __init__(self, message, code):
super().__init__(message)
self.code = code
try:
raise MyCustomError("发生了自定义错误", 500)
except MyCustomError as e:
print(f"错误代码 {e.code}: {e}")
7. 异常捕获的最佳实践
- 具体优于宽泛:尽量捕获具体异常而非所有异常
# 不好
try:
do_something()
except:
pass
# 好
try:
do_something()
except SpecificError:
handle_error()
避免空的 except 块:至少要记录错误
# 不好
try:
do_something()
except SomeError:
pass
# 好
try:
do_something()
except SomeError as e:
log_error(e)
合理使用 finally:确保资源释放
conn = None
try:
conn = create_connection()
use_connection(conn)
except ConnectionError:
handle_error()
finally:
if conn is not None:
conn.close()
不要滥用异常处理:异常应处理异常情况,而非控制流程
# 不好 - 使用异常处理正常流程
try:
value = my_dict[key]
except KeyError:
value = default_value
# 好 - 使用字典的get方法
value = my_dict.get(key, default_value)
8. 异常链(Python 3+)
可以使用 raise from 保留原始异常信息:
try:
import non_existent_module
except ImportError as e:
raise MyError("模块导入失败") from e
9. 上下文管理器与异常处理
上下文管理器 (with 语句) 可以简化资源管理:
传统方式
file = None
try:
file = open('data.txt')
process(file)
finally:
if file is not None:
file.close()
# 使用上下文管理器
with open('data.txt') as file:
process(file) # 文件会自动关闭,即使发生异常
异常捕获是 Python 编程中的重要技能,合理使用可以使程序更加健壮和可靠。记住要针对性地捕获异常,并提供有意义的错误处理。
- 上一篇: python内置函数enumerate详解
- 下一篇: python生成器(Generator)
猜你喜欢
- 2025-05-14 Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸
- 2025-05-14 你想不到的,那些在 Python 中输出列表的技巧
- 2025-05-14 python自动化脚本,解放你的双手(4)
- 2025-05-14 Python索引技巧
- 2025-05-14 在 Python 中从列表中删除换行符的多种方法
- 2025-05-14 Python的元组,没想象的那么简单
- 2025-05-14 对Python中序列的个人理解
- 2025-05-14 简单学Python——字符串
- 2025-05-14 python笔记5:序列
- 2025-05-14 Python 技巧讲解:numpy.array 操作使用简单总结(含示例代码)
- 05-27程序员用 Python 爬取抖音高颜值美女
- 05-27YOLO v3、FaceNet和SVM的人脸检测识别系统源码(python)分享
- 05-27「工具推荐」世界上最简单的人脸识别库 44.7 star
- 05-27开源人脸识别系统源码推荐
- 05-27Go 人脸识别教程
- 05-27Python 深度学习之人脸识别(yolo+facenet)
- 05-27简单的Py人脸识别
- 05-27Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 82℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)