元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Python基础语法
Python环境安装与配置
第一个Python程序
变量与数据类型
字面量详解
基本运算符
流程控制语句
包管理与虚拟环境
▶
Python数据结构
列表(List)详解
元组(Tuple)使用指南
字典(Dict)完全解析
集合(Set)操作大全
▶
函数与模块
函数定义与参数传递
Lambda表达式
模块导入与使用
常用内置函数
▶
面向对象编程
类与对象
继承与多态
魔术方法解析
装饰器原理与应用
▶
Python类型系统
类型注解(Type Hints)
Pydantic基础
Pydantic高级特性
typing模块基础
泛型类型详解
泛型类详解
Callable类型详解
Awaitable类型详解
类型变量与约束
类型别名与Protocol
TypedDict详解
Annotated类型
Reducer类型
类型检查工具使用
类型注解最佳实践
▶
关键字
pass关键字
raise关键字
global关键字
nonlocal关键字
yield关键字
assert关键字
with关键字
async/await关键字
▶
包管理
pip包管理基础
虚拟环境管理
包管理工具对比
requirements.txt规范
依赖管理与requirements.txt
setup.py配置说明
Poetry项目管理工具
Conda包管理系统
打包与发布Python包
PyPI发布流程
私有PyPI仓库
▶
Python高级特性
迭代器与生成器
多线程编程
协程与异步IO
元编程入门
反射机制详解
描述符协议
上下文管理器协议
垃圾回收机制
内存管理深度解析
性能优化指南
▶
文件与异常处理
文件读写操作
JSON数据解析
异常处理机制
上下文管理器
发布时间:
2025-03-24 13:22
↑
☰
# Python异常处理机制详解 本文将详细介绍Python中的异常处理机制,帮助你更好地理解和处理程序中可能出现的错误情况。 ## 异常基础 ### 什么是异常 异常是程序运行时发生的错误。当Python检测到一个错误时,它会创建一个异常对象。如果异常对象未被处理,程序将会终止并显示一个错误信息。 ### 常见的异常类型 ```python # TypeError - 类型错误 print("123" + 456) # TypeError: can only concatenate str (not "int") to str # ValueError - 值错误 int("abc") # ValueError: invalid literal for int() with base 10: 'abc' # NameError - 名称错误 print(undefined_var) # NameError: name 'undefined_var' is not defined # IndexError - 索引错误 list = [1, 2, 3] print(list[3]) # IndexError: list index out of range # KeyError - 键错误 dict = {"a": 1} print(dict["b"]) # KeyError: 'b' # FileNotFoundError - 文件未找到错误 open("nonexistent.txt") # FileNotFoundError: [Errno 2] No such file or directory # ZeroDivisionError - 除零错误 print(10 / 0) # ZeroDivisionError: division by zero ``` ## 异常处理 ### try-except语句 ```python # 基本异常处理 try: num = int(input("请输入一个数字: ")) result = 10 / num print(f"结果是: {result}") except ValueError: print("请输入有效的数字!") except ZeroDivisionError: print("除数不能为零!") # 处理多个异常 try: file = open("test.txt") content = file.read() number = int(content) except FileNotFoundError: print("文件不存在") except ValueError: print("文件内容不是有效的数字") finally: file.close() # 确保文件被关闭 ``` ### else和finally子句 ```python try: num = int(input("请输入一个正数: ")) if num <= 0: raise ValueError("输入必须是正数") except ValueError as e: print(f"错误: {e}") else: # 当try块中没有异常发生时执行 print(f"你输入的数字是: {num}") finally: # 无论是否发生异常都会执行 print("程序执行结束") ``` ### 异常的传播 ```python def divide(x, y): try: result = x / y except ZeroDivisionError: print("除数不能为零!") raise # 重新抛出异常 try: divide(10, 0) except ZeroDivisionError: print("捕获到除零错误") ``` ## 自定义异常 ### 创建自定义异常类 ```python class CustomError(Exception): """自定义异常类""" def __init__(self, message): self.message = message super().__init__(self.message) # 使用自定义异常 def validate_age(age): if age < 0: raise CustomError("年龄不能为负数") if age > 150: raise CustomError("年龄不能超过150岁") return age try: age = validate_age(-5) except CustomError as e: print(f"错误: {e}") ``` ## 实际应用示例 ### 1. 文件处理 ```python class FileHandler: def __init__(self, filename): self.filename = filename self.file = None def open_file(self): try: self.file = open(self.filename, 'r') except FileNotFoundError: print(f"文件 {self.filename} 不存在") return False except PermissionError: print(f"没有权限访问文件 {self.filename}") return False return True def read_integers(self): if not self.open_file(): return [] numbers = [] try: for line in self.file: try: num = int(line.strip()) numbers.append(num) except ValueError: print(f"忽略无效的行: {line.strip()}") finally: self.file.close() return numbers # 使用示例 handler = FileHandler("numbers.txt") result = handler.read_integers() print(f"读取的数字: {result}") ``` ### 2. 网络请求处理 ```python import requests from time import sleep class NetworkError(Exception): """网络错误异常""" pass class APIClient: def __init__(self, base_url): self.base_url = base_url def get_data(self, endpoint, max_retries=3): for attempt in range(max_retries): try: response = requests.get(f"{self.base_url}{endpoint}") response.raise_for_status() # 检查HTTP错误 return response.json() except requests.RequestException as e: if attempt == max_retries - 1: raise NetworkError(f"请求失败: {e}") print(f"重试请求 ({attempt + 1}/{max_retries})") sleep(1) # 等待1秒后重试 # 使用示例 client = APIClient("https://api.example.com") try: data = client.get_data("/users") print("获取的数据:", data) except NetworkError as e: print(f"错误: {e}") ``` ### 3. 数据验证 ```python class ValidationError(Exception): """数据验证错误""" pass class User: def __init__(self, username, email, age): self.username = self.validate_username(username) self.email = self.validate_email(email) self.age = self.validate_age(age) @staticmethod def validate_username(username): if not username: raise ValidationError("用户名不能为空") if len(username) < 3: raise ValidationError("用户名长度必须大于3个字符") return username @staticmethod def validate_email(email): if not "@" in email: raise ValidationError("无效的邮箱地址") return email @staticmethod def validate_age(age): try: age = int(age) if age < 0 or age > 150: raise ValidationError("年龄必须在0-150之间") return age except ValueError: raise ValidationError("年龄必须是数字") # 使用示例 try: user = User("Al", "invalid_email", "not_a_number") except ValidationError as e: print(f"验证错误: {e}") ``` ## 最佳实践 1. **具体异常优于普通异常** ```python # 不好的做法 try: # 一些操作 pass except Exception as e: print(f"发生错误: {e}") # 好的做法 try: # 一些操作 pass except ValueError: print("值错误") except TypeError: print("类型错误") ``` 2. **避免空的except子句** ```python # 不好的做法 try: num = int("abc") except: pass # 忽略所有错误 # 好的做法 try: num = int("abc") except ValueError: print("无法转换为整数") ``` 3. **正确使用finally** ```python # 不好的做法 file = open("test.txt") try: data = file.read() finally: file.close() # 好的做法 with open("test.txt") as file: data = file.read() # 文件会自动关闭 ``` 4. **合理使用自定义异常** ```python # 不好的做法 def process_age(age): if age < 0: raise Exception("年龄不能为负数") # 好的做法 class AgeError(Exception): """年龄相关的错误""" pass def process_age(age): if age < 0: raise AgeError("年龄不能为负数") ``` 通过本文的学习,你应该已经掌握了Python异常处理的基本概念和使用方法。异常处理是编写健壮程序的重要部分,合理使用异常处理机制可以让你的程序更加可靠和易于维护。继续练习和探索,你会发现更多异常处理的应用场景!