本文目录导读:

我来为你详细介绍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异常处理的主要场景和最佳实践,好的异常处理不仅能提高代码的健壮性,还能提供更好的用户体验。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播