本文目录导读:

我来为你详细介绍Python异常处理的常见案例和捕获报错的方法。
基础异常捕获结构
try-except 基本语法
try:
# 可能会出错的代码
result = 10 / 0
except ZeroDivisionError:
# 捕获特定异常
print("除数不能为零!")
捕获多个异常类型
try:
num = int(input("请输入一个数字: "))
result = 10 / num
print(f"结果是: {result}")
except ValueError:
print("输入的不是有效数字!")
except ZeroDivisionError:
print("除数不能为零!")
except Exception as e:
print(f"发生了其他错误: {e}")
实际业务场景案例
案例1:文件操作异常处理
def read_file(filename):
"""安全地读取文件"""
try:
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
return content
except FileNotFoundError:
print(f"错误:文件 '{filename}' 不存在")
return None
except PermissionError:
print(f"错误:没有权限读取文件 '{filename}'")
return None
except Exception as e:
print(f"读取文件时发生未知错误: {e}")
return None
# 测试
content = read_file("config.txt")
if content:
print("文件内容:", content)
案例2:网络请求异常处理
import requests
from requests.exceptions import RequestException, Timeout, ConnectionError
def fetch_data(url, timeout=5):
"""安全地获取网络数据"""
try:
response = requests.get(url, timeout=timeout)
response.raise_for_status() # 检查HTTP状态码
return response.json()
except Timeout:
print(f"请求超时:{url}")
return None
except ConnectionError:
print(f"连接失败:{url}")
return None
except RequestException as e:
print(f"请求错误:{e}")
return None
except ValueError as e:
print(f"返回数据格式错误:{e}")
return None
# 测试
data = fetch_data("https://api.example.com/data")
if data:
print("获取的数据:", data)
案例3:数据库操作异常处理
import sqlite3
from sqlite3 import Error
def safe_database_operation():
"""安全执行数据库操作"""
conn = None
try:
# 连接数据库
conn = sqlite3.connect('mydb.db')
cursor = conn.cursor()
# 执行SQL操作
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Alice",))
# 提交事务
conn.commit()
print("数据库操作成功")
except sqlite3.IntegrityError:
print("数据完整性错误")
if conn:
conn.rollback() # 回滚事务
except sqlite3.OperationalError as e:
print(f"数据库操作错误: {e}")
if conn:
conn.rollback()
except Error as e:
print(f"SQLite错误: {e}")
if conn:
conn.rollback()
finally:
if conn:
conn.close() # 确保关闭连接
案例4:数据转换与验证
def safe_convert_to_int(value, default=None):
"""安全转换字符串为整数"""
try:
return int(value)
except (ValueError, TypeError):
return default
def safe_division(a, b):
"""安全执行除法"""
try:
result = a / b
except ZeroDivisionError:
print("除数不能为零")
return None
except TypeError:
print("参数类型错误")
return None
else:
# 没有异常时执行
print("除法运算成功")
return result
finally:
# 无论是否异常都会执行
print("除法运算结束")
# 测试
print(safe_convert_to_int("123")) # 输出: 123
print(safe_convert_to_int("abc")) # 输出: None
print(safe_convert_to_int("12.34")) # 输出: None
print(safe_division(10, 2)) # 输出: 5.0
print(safe_division(10, 0)) # 输出: None
高级异常处理技巧
自定义异常类
class InsufficientBalanceError(Exception):
"""余额不足异常"""
def __init__(self, balance, amount, message="余额不足"):
self.balance = balance
self.amount = amount
self.message = f"{message}: 余额 {balance},需要 {amount}"
super().__init__(self.message)
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise InsufficientBalanceError(self.balance, amount)
self.balance -= amount
return self.balance
# 使用自定义异常
account = BankAccount(100)
try:
account.withdraw(200)
except InsufficientBalanceError as e:
print(f"错误: {e}")
print(f"当前余额: {e.balance}, 需要: {e.amount}")
异常链
def process_data():
try:
# 模拟数据处理
raise ValueError("数据格式错误")
except ValueError as e:
# 保留原始异常信息
raise RuntimeError("数据处理失败") from e
try:
process_data()
except RuntimeError as e:
print(f"异常类型: {type(e).__name__}")
print(f"异常信息: {e}")
print(f"原始异常: {e.__cause__}")
最佳实践建议
使用上下文管理器处理资源
# 不好的方式
file = None
try:
file = open("test.txt", "r")
data = file.read()
finally:
if file:
file.close()
# 好的方式 - 使用with语句自动管理资源
try:
with open("test.txt", "r") as file:
data = file.read()
except FileNotFoundError:
print("文件不存在")
异常处理原则
def good_exception_handling():
"""
好的异常处理实践:
1. 具体异常先捕获,通用异常后捕获
2. 不要过度使用try-except
3. 只在可能出错的代码处使用异常处理
4. 记录异常信息到日志
"""
import logging
logger = logging.getLogger(__name__)
try:
# 具体业务逻辑
pass
except (ValueError, TypeError) as e:
# 捕获具体异常
logger.error(f"数据错误: {e}")
except IOError as e:
# 捕获IO异常
logger.error(f"IO错误: {e}")
except Exception as e:
# 最后捕获所有其他异常
logger.critical(f"未预期的错误: {e}", exc_info=True)
raise # 重新抛出异常
这些案例涵盖了Python异常处理的主要场景和最佳实践,好的异常处理不仅能提高代码的健壮性,还能提供更好的用户体验。