[Python基础](8) python异常处理

作者制作不易,关注、点赞、收藏一下吧!

Python 异常处理详解

在 Python 编程中,异常处理是确保程序健壮性和稳定性的关键部分。通过合理地捕获和处理异常,可以避免程序因错误而崩溃,并提供友好的错误提示或恢复机制。

一、什么是异常?

异常(Exception)是指程序运行时发生的非正常情况。当程序遇到无法继续执行的错误时,会抛出一个异常。例如,访问不存在的文件、除以零、索引越界等都会引发异常。

Python 提供了一套完善的异常处理机制,允许开发者捕获并处理这些异常,从而保证程序的正常运行。

二、常见的异常类型

Python 内置了许多标准异常类型,以下是一些常见的异常及其描述:

python标准异常类型
异常类型描述
SyntaxError语法错误
NameError尝试访问未定义的变量
TypeError操作或函数应用于不适当类型的对象
ValueError函数接收到具有正确类型但值不合适的参数
IndexError索引超出序列范围
KeyError字典中不存在指定的键
IOError输入/输出操作失败(如文件读写错误)
ZeroDivisionError整数除法或取模运算中除数为零
ImportError导入模块失败
FileNotFoundError尝试访问不存在的文件

三、异常处理的基本语法

1. `try...except` 结构

这是最基本的异常处理结构,用于捕获并处理异常。

try:
    # 可能引发异常的代码
    result = 10 / 0
except ZeroDivisionError as e:
    # 处理异常
    print(f"发生异常: {e}")


解释:
- `try` 块中包含可能引发异常的代码。
- 如果发生异常,则跳转到 `except` 块进行处理。
- `as e` 可以捕获具体的异常信息。

2. 捕获多个异常

可以通过在 `except` 后面列出多个异常类型来捕获多种异常。

try:
    file = open("nonexistent_file.txt", "r")
    data = file.read()
except (FileNotFoundError, IOError) as e:
    print(f"文件操作错误: {e}")

3. 使用 `else` 和 `finally`

- `else` 块会在没有异常时执行。
- `finally` 块无论是否发生异常都会执行,通常用于释放资源。

try:
    file = open("example.txt", "r")
    data = file.read()
except FileNotFoundError as e:
    print(f"文件未找到: {e}")
else:
    print("文件读取成功")
finally:
    file.close()  # 确保文件关闭

四、自定义异常

除了使用内置异常类型外,还可以根据需求定义自己的异常类。

class MyCustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

def check_value(x):
    if x < 0:
        raise MyCustomError("输入值不能为负数")

try:
    check_value(-5)
except MyCustomError as e:
    print(f"自定义异常: {e}")

解释:
定义了一个名为 `MyCustomError` 的自定义异常类。
在函数 `check_value` 中,如果输入值小于 0,则抛出自定义异常。

五、异常链

在某些情况下,异常需要传递给调用者,同时保留原始异常信息。这可以通过异常链实现。
 

try:
    # 模拟底层错误
    raise ValueError("底层错误")
except ValueError as e:
    # 抛出新异常并保留原始异常信息
    raise RuntimeError("高层错误") from e


解释:
使用 `from` 关键字将原始异常与新异常关联起来。
这样可以在调试时查看完整的错误链。

六、异常处理的最佳实践

1. 避免空的 `except` 块

不要捕获所有异常而不做任何处理,这样会导致潜在问题被忽略。

try:
    # 错误示例:捕获所有异常但不做处理
    result = 10 / 0
except:
    pass  # 不推荐


改为捕获特定异常:

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"发生异常: {e}")

2. 使用上下文管理器

对于需要手动释放资源的操作(如文件读写),建议使用上下文管理器。
 

# 推荐方式
with open("example.txt", "r") as file:
    data = file.read()

# 不推荐方式
file = open("example.txt", "r")
data = file.read()
file.close()

3. 记录日志

在生产环境中,应记录异常信息以便后续分析。
 

import logging

logging.basicConfig(level=logging.ERROR)

try:
    result = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"发生异常: {e}")

更多详细内容见python官方文档:python官方文档-异常处理

作者制作不易,关注、点赞、收藏一下吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值