Python中高效处理异常情况的实用技巧

```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代码,有效处理各种异常情况。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值