python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python try-except到自定义异常

Python异常处理从try-except到自定义异常的全过程

作者:cartech

在Python编程中,异常处理是写出健壮代码的关键技能,本文将带你深入了解Python的异常处理机制,从基础的try-except到自定义异常,让你的程序更加稳定和可靠,感兴趣的朋友跟随小编一起看看吧

🛡️ Python异常处理完全指南:从try-except到自定义异常

在Python编程中,异常处理是写出健壮代码的关键技能。本文将带你深入了解Python的异常处理机制,从基础的try-except到自定义异常,让你的程序更加稳定和可靠。

📌 什么是异常?

异常(Exception)是程序执行过程中发生的错误事件,会中断程序的正常流程。Python使用异常对象来表示各种错误情况,如除以零、文件不存在、索引越界等。

🔧 基础语法:try-except

最基本的异常处理结构是try-except语句:

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

📋 捕获多种异常

可以捕获多种不同类型的异常:

try:
    number = int(input("请输入一个数字:"))
    result = 100 / number
except ValueError:
    print("输入无效!请输入数字。")
except ZeroDivisionError:
    print("不能除以零!")

🔍 获取异常信息

使用as关键字可以获取异常对象,查看详细信息:

try:
    file = open("不存在的文件.txt", "r")
except FileNotFoundError as e:
    print(f"错误信息:{e}")
    print(f"错误类型:{type(e).__name__}")

⚡ else 和 finally

else块在没有异常时执行,finally块无论是否发生异常都会执行:

try:
    file = open("data.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件未找到")
else:
    print(f"文件内容:{content}")
finally:
    print("清理工作完成")
    if 'file' in locals():
        file.close()

🎯 捕获所有异常

使用Exception可以捕获大部分异常(但不建议滥用):

try:
    # 可能出错的代码
    risky_operation()
except Exception as e:
    print(f"发生错误:{e}")
    # 记录日志或进行其他处理

🚀 raise 主动抛出异常

使用raise可以主动抛出异常:

def check_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    if age > 150:
        raise ValueError("年龄不现实")
    return age

try:
    check_age(-5)
except ValueError as e:
    print(f"验证失败:{e}")

🎨 自定义异常

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

class ValidationError(Exception):
    """数据验证错误"""
    pass
class InsufficientFundsError(Exception):
    """余额不足错误"""
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(f"余额 {balance} 不足,需要 {amount}")
# 使用自定义异常
class BankAccount:
    def __init__(self, balance=0):
        self.balance = balance
    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientFundsError(self.balance, amount)
        self.balance -= amount
        return self.balance
# 测试
account = BankAccount(100)
try:
    account.withdraw(200)
except InsufficientFundsError as e:
    print(f"取款失败:{e}")
    print(f"当前余额:{e.balance}")
    print(f"请求金额:{e.amount}")

🔗 异常链

使用raise from可以在转换异常时保留原始异常信息:

def parse_config(data):
    try:
        return json.loads(data)
    except json.JSONDecodeError as e:
        raise ConfigError("配置文件格式错误") from e
# 这样可以看到完整的异常链

📝 最佳实践

  1. 精确捕获:尽量捕获具体的异常类型,而不是泛泛的Exception
  2. 不要静默处理:空的except块会隐藏问题,至少要记录日志
  3. 使用finally释放资源:或使用上下文管理器(with语句)
  4. 异常信息要清晰:自定义异常时提供有用的错误信息
  5. 不要滥用异常:异常是用于错误处理,不是流程控制

🎁 上下文管理器与异常

with语句自动处理资源释放,即使在异常情况下:

# 不需要手动关闭文件,with会自动处理
with open("data.txt", "r") as file:
    content = file.read()
    # 即使这里发生异常,文件也会被正确关闭

🎯 总结

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

掌握异常处理,让你的Python程序更加健壮和专业!💪

到此这篇关于Python异常处理从try-except到自定义异常的全过程的文章就介绍到这了,更多相关Python try-except到自定义异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文