Python异常处理案例如何捕获报错

wen python案例 31

本文目录导读:

Python异常处理案例如何捕获报错

  1. 基础异常捕获结构
  2. 实际业务场景案例
  3. 高级异常处理技巧
  4. 最佳实践建议

我来为你详细介绍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异常处理的主要场景和最佳实践,好的异常处理不仅能提高代码的健壮性,还能提供更好的用户体验。

抱歉,评论功能暂时关闭!