python基础语法10-异常处理

Python 异常处理详解

在软件开发中,异常(Error)是不可预见的错误或意外情况。Python 提供了强大的异常处理机制,使我们能够优雅地处理运行时错误,避免程序崩溃,提升代码的健壮性与稳定性。本文将详细介绍 Python 的异常处理机制,包括 try-except 结构、finally 语句以及如何定义和使用自定义异常。


1. try-except 结构

try-except 结构是 Python 中异常处理的核心。我们通过 try 块放置可能抛出异常的代码,如果在执行时发生异常,程序会跳转到 except 块,执行相应的处理。

1.1 基本结构

最简单的异常处理方法是直接用 try-except 结构捕获异常。例如,下面的代码尝试进行除法运算,若除数为零,则会触发 ZeroDivisionError 异常。

python 复制代码
try:
    x = 10 / 0  # 触发 ZeroDivisionError
except ZeroDivisionError:
    print("不能除以零!")

在这个例子中,当 10 / 0 触发 ZeroDivisionError 异常时,程序跳转到 except 块执行错误处理代码。

1.2 捕获不同类型的异常

你可以使用多个 except 块来捕获不同类型的异常,或者通过一个 except 块同时处理多种异常。

python 复制代码
try:
    x = 10 / 0  # 触发 ZeroDivisionError
    y = int("abc")  # 触发 ValueError
except ZeroDivisionError:
    print("发生了除以零错误")
except ValueError:
    print("发生了值错误")

也可以使用 except 块捕获多个异常类型:

python 复制代码
try:
    x = 10 / 0
    y = int("abc")
except (ZeroDivisionError, ValueError) as e:
    print(f"发生了错误: {e}")

通过 as 关键字,我们可以捕获异常对象,并获取异常的详细信息。

1.3 获取异常信息

我们还可以通过 as 获取异常的详细信息,例如异常的类型和描述。

python 复制代码
try:
    x = int("abc")  # 会触发 ValueError
except ValueError as e:
    print(f"错误类型: {type(e)}")
    print(f"错误信息: {e}")

输出:

复制代码
错误类型: <class 'ValueError'>
错误信息: invalid literal for int() with base 10: 'abc'

2. finally 语句

finally 语句用于无论是否发生异常,都会执行的一段代码。通常用于资源的清理操作,比如关闭文件、释放数据库连接等。即使 try 块或 except 块发生了异常,finally 中的代码也会执行。

2.1 基本用法

python 复制代码
try:
    x = 10 / 0  # 触发 ZeroDivisionError
except ZeroDivisionError:
    print("发生了除以零错误")
finally:
    print("这部分代码无论如何都会执行")

输出:

复制代码
发生了除以零错误
这部分代码无论如何都会执行

2.2 finally 用于资源清理

在很多情况下,我们需要在 finally 中执行一些资源清理工作,比如关闭文件或数据库连接,以避免资源泄漏。

python 复制代码
try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件未找到")
finally:
    if 'file' in locals():
        file.close()
    print("文件已关闭")

即使文件打开过程中发生异常,finally 语句中的文件关闭操作仍会执行,确保资源被释放。


3. 自定义异常

有时我们需要根据业务需求来定义特定的异常,Python 允许我们通过继承 Exception 类来自定义异常类。自定义异常可以让我们的错误信息更加明确,方便后续的调试和维护。

3.1 定义自定义异常

自定义异常通常继承自 Exception 类,并可以通过 __init__ 方法添加额外的错误信息。

python 复制代码
class InvalidAgeError(Exception):
    def __init__(self, message="年龄无效"):
        self.message = message
        super().__init__(self.message)

# 使用自定义异常
try:
    age = -5
    if age < 0:
        raise InvalidAgeError("年龄不能为负数!")
except InvalidAgeError as e:
    print(f"发生自定义异常: {e}")

输出:

复制代码
发生自定义异常: 年龄不能为负数!

3.2 自定义异常带有额外信息

自定义异常类也可以包含更多的信息,比如错误代码或其他的附加信息。例如:

python 复制代码
class InvalidAgeError(Exception):
    def __init__(self, age, message="年龄无效"):
        self.age = age
        self.message = message
        super().__init__(self.message)

def check_age(age):
    if age < 0:
        raise InvalidAgeError(age, "年龄不能为负数")
    else:
        print("年龄有效")

# 调用
try:
    check_age(-5)
except InvalidAgeError as e:
    print(f"错误信息: {e}, 错误的年龄: {e.age}")

输出:

复制代码
错误信息: 年龄不能为负数, 错误的年龄: -5

3.3 使用 raise 关键字抛出自定义异常

使用 raise 关键字抛出自定义异常,并通过 try-except 捕获它。这样可以在程序中某些条件不满足时主动抛出异常。

python 复制代码
def validate_password(password):
    if len(password) < 6:
        raise ValueError("密码长度至少为6个字符")
    return True

try:
    validate_password("12345")
except ValueError as e:
    print(f"密码验证失败: {e}")

输出:

复制代码
密码验证失败: 密码长度至少为6个字符

通过 Python 的异常处理机制,我们能够有效捕获并处理运行时的错误,使得程序在异常情况下依然能够继续执行或者提供友好的错误信息。 try-except 结构帮助我们捕获各种类型的错误,finally 语句确保资源的正确释放,而自定义异常使得我们能够针对特定的业务需求提供清晰的错误信息。掌握这些异常处理技巧,将使我们的程序更稳定、可维护,并能够更好地应对各种意外情况。

相关推荐
一千柯橘2 分钟前
python 项目搭建(类比 node 来学习)
python
sduwcgg7 分钟前
python的numpy的MKL加速
开发语言·python·numpy
大模型真好玩9 分钟前
可视化神器WandB,大模型训练的必备工具!
人工智能·python·mcp
wkj00110 分钟前
QuaggaJS 配置参数详解
java·linux·服务器·javascript·quaggajs
东方佑10 分钟前
使用 Python 自动化 Word 文档样式复制与内容生成
python·自动化·word
钢铁男儿16 分钟前
Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)
开发语言·python
databook25 分钟前
当机器学习遇见压缩感知:用少量数据重建完整世界
python·机器学习·scikit-learn
暴力求解29 分钟前
C++类和对象(上)
开发语言·c++·算法
让我们一起加油好吗42 分钟前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
大锦终43 分钟前
【C++】特殊类设计
开发语言·c++