【Day 13-N24】 Python 的异常捕获、多重异常捕获、try-except 语句嵌套、使用finally代码块、自定义异常类、手动引发异常

挑战14天学会Python,第13天学习笔记!加油!

1. 异常处理概述

在Python编程中,异常处理是保证程序健壮性的重要机制。异常(Exception)是程序运行时发生的错误事件,会中断正常的程序流程。良好的异常处理能够:

  1. 防止程序意外崩溃
  2. 提供友好的错误提示
  3. 实现错误恢复逻辑
  4. 保证资源正确释放

Python使用try-except语句结构来处理异常,其基本语法如下:

try:
    # 可能引发异常的代码
except ExceptionType:
    # 异常处理代码

2. 基础异常捕获

2.1 捕获单个异常

最基本的异常捕获形式是指定具体的异常类型:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("不能除以零!")

2.2 捕获多个异常

可以使用多个except子句捕获不同类型的异常:

try:
    num = int(input("请输入数字: "))
    result = 10 / num
except ValueError:
    print("输入的不是有效数字!")
except ZeroDivisionError:
    print("不能除以零!")

2.3 捕获所有异常

使用Exception基类可以捕获几乎所有异常(不包含系统退出等特殊异常):

try:
    # 可能出错的代码
except Exception as e:
    print(f"发生错误: {e}")

注意:过度使用捕获所有异常会掩盖潜在问题,建议尽量捕获具体异常类型。

3. 高级异常处理技术

3.1 多重异常捕获

Python允许在一个except子句中捕获多种异常:

try:
    file = open("data.txt")
    data = file.read()
    num = int(data)
except (FileNotFoundError, ValueError) as e:
    print(f"文件不存在或内容无效: {e}")

3.2 try-except语句嵌套

可以在一个try-except块中嵌套另一个:

try:
    try:
        num = int(input("请输入数字: "))
    except ValueError:
        print("输入的不是有效数字!")
        num = 0
    result = 10 / num
except ZeroDivisionError:
    print("不能除以零!")

3.3 else子句的使用

else子句在try块没有引发异常时执行:

try:
    result = 10 / 2
except ZeroDivisionError:
    print("除零错误")
else:
    print(f"计算结果: {result}")  # 仅当没有异常时执行

4. 资源管理与finally代码块

4.1 finally的基本用法

finally子句无论是否发生异常都会执行,常用于资源清理:

file = None
try:
    file = open("data.txt", "r")
    content = file.read()
except IOError:
    print("文件操作失败")
finally:
    if file:
        file.close()  # 确保文件总是被关闭

4.2 with语句与上下文管理器

Python推荐使用with语句自动管理资源:

try:
    with open("data.txt", "r") as file:
        content = file.read()
except IOError:
    print("文件操作失败")

with语句会自动调用文件的__enter__()__exit__()方法,确保资源正确释放。

5. 自定义异常类

5.1 创建自定义异常

通过继承Exception类可以创建自定义异常:

class InvalidAgeError(Exception):
    """年龄无效异常"""
    def __init__(self, age, message="年龄必须在0-120之间"):
        self.age = age
        self.message = message
        super().__init__(self.message)

    def __str__(self):
        return f"{self.age} -> {self.message}"

5.2 使用自定义异常

def set_age(age):
    if not 0 <= age <= 120:
        raise InvalidAgeError(age)
    print(f"年龄设置为: {age}")

try:
    set_age(150)
except InvalidAgeError as e:
    print(e)  # 输出: 150 -> 年龄必须在0-120之间

5.3 异常继承体系

可以构建复杂的异常继承体系:

class DatabaseError(Exception):
    """数据库基类异常"""

class ConnectionError(DatabaseError):
    """连接错误"""

class QueryError(DatabaseError):
    """查询错误"""

6. 手动引发异常

6.1 raise语句

使用raise关键字手动引发异常:

def login(username, password):
    if not username or not password:
        raise ValueError("用户名和密码不能为空")
    # 登录逻辑...

6.2 重新引发异常

可以在except块中重新引发当前异常:

try:
    # 可能出错的代码
except SomeError:
    print("发生错误,记录日志...")
    raise  # 重新引发异常

6.3 异常链

使用raise from创建异常链,保留原始异常信息:

try:
    # 可能出错的代码
except SomeError as e:
    raise CustomError("自定义错误信息") from e

7. 总结

Python异常处理机制提供了强大的错误处理能力:

  1. 基础try-except结构可以捕获和处理异常
  2. 多重异常捕获和嵌套使代码更简洁
  3. finally确保资源正确释放
  4. 自定义异常提高代码可读性和维护性
  5. raise允许手动触发异常
  6. 合理的异常处理是编写健壮程序的关键

掌握这些技术后,可以编写出更加健壮、可维护的Python代码,有效处理各种运行时错误情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值