```python
# Python异常处理实用技巧
## 1. 基础异常处理结构
```python
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError as e:
# 处理特定异常
print(f除零错误: {e})
except Exception as e:
# 处理其他异常
print(f其他错误: {e})
else:
# 无异常时执行
print(计算成功)
finally:
# 无论是否异常都会执行
print(清理操作)
```
## 2. 上下文管理器处理资源
```python
# 自动处理文件关闭
with open('file.txt', 'r') as f:
content = f.read()
# 文件会自动关闭,即使发生异常
# 自定义上下文管理器
from contextlib import contextmanager
@contextmanager
def database_connection():
conn = create_connection()
try:
yield conn
except Exception as e:
print(f数据库错误: {e})
raise
finally:
conn.close()
# 使用
with database_connection() as conn:
conn.execute_query(SELECT FROM users)
```
## 3. 异常链与重新抛出
```python
def process_data(data):
try:
return int(data)
except ValueError as e:
# 保留原始异常信息
raise TypeError(f数据格式错误: {data}) from e
try:
process_data(abc)
except TypeError as e:
print(f捕获的异常: {e})
print(f原始异常: {e.__cause__})
```
## 4. 自定义异常类
```python
class ValidationError(Exception):
自定义验证异常
def __init__(self, message, field=None):
self.message = message
self.field = field
super().__init__(self.message)
def validate_user(user_data):
if not user_data.get('name'):
raise ValidationError(用户名不能为空, field='name')
try:
validate_user({})
except ValidationError as e:
print(f验证失败: {e.message}, 字段: {e.field})
```
## 5. 使用装饰器统一处理异常
```python
def handle_exceptions(func):
def wrapper(args, kwargs):
try:
return func(args, kwargs)
except ValueError as e:
print(f值错误: {e})
return None
except KeyError as e:
print(f键错误: {e})
return None
except Exception as e:
print(f未知错误: {e})
return None
return wrapper
@handle_exceptions
def risky_operation(data):
return data['key'] + 1
```
## 6. 异常日志记录
```python
import logging
logging.basicConfig(level=logging.ERROR)
def log_exceptions(func):
def wrapper(args, kwargs):
try:
return func(args, kwargs)
except Exception as e:
logging.error(f函数 {func.__name__} 执行失败: {e},
exc_info=True)
raise
return wrapper
@log_exceptions
def critical_operation():
# 重要操作
pass
```
## 7. 条件异常处理
```python
def process_with_retry(func, max_retries=3):
for attempt in range(max_retries):
try:
return func()
except (ConnectionError, TimeoutError) as e:
if attempt == max_retries - 1:
raise
print(f尝试 {attempt + 1} 失败,重试...)
continue
# 使用
result = process_with_retry(lambda: connect_to_service())
```
## 8. 使用else块优化逻辑
```python
def process_file(filename):
try:
with open(filename, 'r') as f:
data = f.read()
except FileNotFoundError:
print(f文件 {filename} 不存在)
return None
else:
# 只有在没有异常时才执行处理逻辑
processed_data = data.strip().upper()
return processed_data
finally:
print(文件处理完成)
```
## 9. 异常类型检查与处理
```python
def safe_divide(a, b):
try:
return a / b
except Exception as e:
if isinstance(e, ZeroDivisionError):
return float('inf') if a > 0 else float('-inf')
elif isinstance(e, TypeError):
return 类型错误: 需要数字类型
else:
raise
print(safe_divide(10, 0)) # inf
print(safe_divide(10, 'a')) # 类型错误
```
## 10. 使用functools.singledispatch处理不同类型异常
```python
from functools import singledispatch
@singledispatch
def handle_error(exc):
默认异常处理器
print(f未知异常: {exc})
@handle_error.register
def _(exc: ValueError):
print(f值错误处理: {exc})
@handle_error.register
def _(exc: KeyError):
print(f键错误处理: {exc})
# 使用
try:
risky_operation()
except Exception as e:
handle_error(e)
```
## 最佳实践总结
1. 具体异常优先: 捕获具体异常而非通用Exception
2. 避免空except: 至少要记录或处理异常
3. 合理使用finally: 确保资源清理
4. 异常信息完整: 提供有意义的错误信息
5. 适当重新抛出: 在适当层级处理异常
6. 日志记录: 重要异常必须记录日志
7. 自定义异常: 为业务逻辑定义清晰的异常类型
这些技巧能帮助编写更健壮、可维护的Python代码,有效处理各种异常情况。

被折叠的 条评论
为什么被折叠?



