Python案例中的异常捕获怎么写?

wen python案例 3

本文目录导读:

Python案例中的异常捕获怎么写?

  1. 基本语法结构
  2. 捕获特定异常类型
  3. 完整的异常处理结构
  4. 实际案例:用户输入验证
  5. 文件操作异常处理
  6. 网络请求异常处理
  7. 自定义异常
  8. 最佳实践总结
  9. 关键要点:

在Python中,异常捕获使用 try-except 语句,以下是详细的案例说明:

基本语法结构

try:
    # 可能引发异常的代码
    result = 10 / 0
except:
    # 异常处理代码
    print("捕获到异常")

捕获特定异常类型

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
    print(f"10/{num} = {result}")
except ValueError:
    print("输入的不是有效数字")
except ZeroDivisionError:
    print("除数不能为0")
except Exception as e:
    print(f"其他异常: {e}")

完整的异常处理结构

try:
    # 尝试执行的代码
    file = open("example.txt", "r")
    content = file.read()
    num = int(content)
    result = 100 / num
except FileNotFoundError:
    print("文件不存在")
except ValueError:
    print("文件内容不是有效数字")
except ZeroDivisionError:
    print("文件中的数字不能为0")
except Exception as e:
    print(f"未预料的异常: {e}")
else:
    # 没有异常时执行
    print(f"计算结果是: {result}")
finally:
    # 无论是否异常都会执行
    try:
        file.close()
    except:
        pass

实际案例:用户输入验证

def safe_division():
    """
    安全的除法运算,处理各种异常情况
    """
    try:
        num1 = float(input("请输入第一个数字: "))
        num2 = float(input("请输入第二个数字: "))
        result = num1 / num2
    except ValueError:
        print("❌ 输入无效,请输入数字")
        return None
    except ZeroDivisionError:
        print("❌ 除数不能为0")
        return None
    except Exception as e:
        print(f"❌ 发生未知错误: {e}")
        return None
    else:
        print(f"✅ {num1} / {num2} = {result:.2f}")
        return result
    finally:
        print("✓ 程序执行完毕")
# 测试
safe_division()

文件操作异常处理

def read_file_safe(filename):
    """
    安全的文件读取函数
    """
    try:
        # 尝试打开文件
        with open(filename, 'r', encoding='utf-8') as file:
            content = file.read()
        # 尝试处理文件内容
        numbers = [int(x) for x in content.split()]
        average = sum(numbers) / len(numbers)
        return average
    except FileNotFoundError:
        print(f"文件 '{filename}' 不存在")
        return None
    except PermissionError:
        print(f"没有权限读取文件 '{filename}'")
        return None
    except ValueError:
        print("文件内容格式错误,需要数字")
        return None
    except ZeroDivisionError:
        print("文件为空,无法计算平均值")
        return None
    except Exception as e:
        print(f"读取文件时发生错误: {e}")
        return None
# 使用示例
result = read_file_safe("data.txt")
if result is not None:
    print(f"平均值是: {result}")

网络请求异常处理

import requests
def fetch_website(url):
    """
    安全的网络请求函数
    """
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()  # 检查HTTP状态码
        return response.text
    except requests.exceptions.Timeout:
        print("请求超时")
        return None
    except requests.exceptions.ConnectionError:
        print("网络连接失败")
        return None
    except requests.exceptions.HTTPError as e:
        print(f"HTTP错误: {e}")
        return None
    except Exception as e:
        print(f"请求时发生错误: {e}")
        return None
# 测试
content = fetch_website("https://example.com")
if content:
    print("成功获取网站内容")

自定义异常

# 定义自定义异常
class AgeError(Exception):
    """年龄验证异常"""
    def __init__(self, age, message="年龄无效"):
        self.age = age
        self.message = message
        super().__init__(self.message)
class EmailError(Exception):
    """邮箱验证异常"""
    pass
def validate_age(age):
    """验证年龄"""
    if not isinstance(age, int):
        raise TypeError("年龄必须是整数")
    if age < 0:
        raise AgeError(age, "年龄不能为负数")
    if age > 150:
        raise AgeError(age, "年龄超出合理范围")
    return True
def validate_email(email):
    """验证邮箱"""
    if "@" not in email:
        raise EmailError("邮箱格式无效,缺少@符号")
    if "." not in email:
        raise EmailError("邮箱格式无效,缺少点号")
    return True
# 使用自定义异常
def process_user_info():
    try:
        age = int(input("请输入年龄: "))
        validate_age(age)
        email = input("请输入邮箱: ")
        validate_email(email)
        print(f"用户信息验证成功! 年龄: {age}, 邮箱: {email}")
    except AgeError as e:
        print(f"年龄错误: {e}")
    except EmailError as e:
        print(f"邮箱错误: {e}")
    except ValueError:
        print("年龄必须是数字")
    except Exception as e:
        print(f"未知错误: {e}")
# 测试
# process_user_info()

最佳实践总结

# 1. 尽量不要捕获所有异常
# 不好
try:
    # code
except:
    pass
# 好
try:
    # code
except SpecificError:
    # 处理特定异常
# 2. 总是在finally中清理资源
file = None
try:
    file = open("file.txt", "r")
    # 处理文件
finally:
    if file:
        file.close()
# 3. 使用上下文管理器 (with语句) 自动处理
with open("file.txt", "r") as file:
    content = file.read()  # 自动关闭
# 4. 记录异常日志
import logging
logging.basicConfig(level=logging.ERROR)
try:
    # code
except Exception as e:
    logging.error(f"发生错误: {e}", exc_info=True)
    # 或者
    logging.exception("发生错误")

关键要点:

  1. 捕获特定异常:尽量捕获具体的异常类型
  2. 避免空except:除非有必要,不要使用 except: 捕获所有异常
  3. 使用finally:确保资源被正确释放
  4. 记录日志:在生产环境中记录异常信息
  5. 异常链:使用 raise ... from ... 保持异常链
  6. 自定义异常:为特定业务逻辑创建自定义异常

这些是Python异常捕获的常见用法和最佳实践,根据你的具体需求选择合适的方案。

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