Python异常处理:自定义异常②

在这里插入图片描述

文章目录

    • 1. 什么是自定义异常?
    • 2. 为什么需要自定义异常?
    • 3. 如何定义自定义异常?
      • 3.1 基本自定义异常
      • 3.2 带详细信息的自定义异常
      • 3.3 自定义异常的继承层次
    • 4. 使用自定义异常
      • 4.1 抛出自定义异常
      • 4.2 捕获自定义异常
    • 5. 自定义异常的应用场景
      • 5.1 数据验证
      • 5.2 业务逻辑
      • 5.3 数据库操作
    • 6. 综合详细的例子
      • 6.1 示例代码
      • 6.2 示例解释
      • 6.3 执行结果
    • 7. 总结

在编程过程中,异常处理是一个非常重要的部分,能够有效地帮助程序员应对各种意外情况。除了Python内置的异常类型,开发者还可以创建自定义异常,以更灵活和细致地处理特定的错误情形。本文将详细介绍Python自定义异常的概念、定义方法、使用场景以及最佳实践,并附上一个综合详细的示例。

1. 什么是自定义异常?

自定义异常是指开发者根据特定需求,继承Python内置的Exception类或其子类,创建的自定义异常类。自定义异常可以提供更具体的错误信息,并使得异常处理逻辑更加清晰和有针对性。

2. 为什么需要自定义异常?

在实际开发中,内置异常类型有时无法准确表达业务逻辑中的错误情况。自定义异常可以:

  • 提供更具体和有意义的错误信息。
  • 将错误处理逻辑分离,保持代码的清晰性和可维护性。
  • 便于调试和排查问题。

3. 如何定义自定义异常?

定义自定义异常非常简单,只需创建一个继承自Exception类的新类即可。通常,自定义异常类会重写__init__方法,以便接受和存储更多的错误信息。

3.1 基本自定义异常

class MyCustomError(Exception):pass

3.2 带详细信息的自定义异常

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

3.3 自定义异常的继承层次

可以创建多个自定义异常类,形成继承层次结构,以便在不同的场景下使用。

class ApplicationError(Exception):"""应用程序通用异常"""passclass DatabaseError(ApplicationError):"""数据库相关异常"""passclass NetworkError(ApplicationError):"""网络相关异常"""pass

4. 使用自定义异常

自定义异常的使用方法与内置异常相同,主要包括抛出(raise)和捕获(catch)两个方面。

4.1 抛出自定义异常

可以在程序中的特定位置抛出自定义异常,以便在错误发生时引发异常并传递错误信息。

def connect_to_database():raise DatabaseError("无法连接到数据库")try:connect_to_database()
except DatabaseError as e:print(f"捕获到数据库异常:{e}")

4.2 捕获自定义异常

可以使用try-except语句捕获自定义异常,并根据需要处理错误。

try:connect_to_database()
except ApplicationError as e:print(f"捕获到应用程序异常:{e}")
except DatabaseError as e:print(f"捕获到数据库异常:{e}")
except NetworkError as e:print(f"捕获到网络异常:{e}")

5. 自定义异常的应用场景

自定义异常可以应用于各种场景,常见的包括:

5.1 数据验证

在数据验证过程中,可以使用自定义异常来捕获和处理无效数据。

class ValidationError(Exception):passdef validate_age(age):if age < 0 or age > 150:raise ValidationError("年龄无效")try:validate_age(-5)
except ValidationError as e:print(f"捕获到数据验证异常:{e}")

5.2 业务逻辑

在处理复杂的业务逻辑时,可以使用自定义异常来捕获和处理特定的业务错误。

class BusinessLogicError(Exception):passdef process_order(order):if order['status'] != 'confirmed':raise BusinessLogicError("订单状态无效")try:order = {'status': 'pending'}process_order(order)
except BusinessLogicError as e:print(f"捕获到业务逻辑异常:{e}")

5.3 数据库操作

在数据库操作中,可以使用自定义异常来捕获和处理数据库连接失败、查询错误等问题。

class DatabaseConnectionError(DatabaseError):passdef connect_to_db():# 模拟数据库连接失败raise DatabaseConnectionError("数据库连接失败")try:connect_to_db()
except DatabaseConnectionError as e:print(f"捕获到数据库连接异常:{e}")

6. 综合详细的例子

下面是一个综合详细的例子,展示了如何在一个简单的图书管理系统中使用自定义异常来处理各种错误情况。

6.1 示例代码

class LibraryError(Exception):"""图书馆通用异常"""passclass BookNotFoundError(LibraryError):"""图书未找到异常"""def __init__(self, title):super().__init__(f"图书未找到:{title}")self.title = titleclass BookAlreadyExistsError(LibraryError):"""图书已存在异常"""def __init__(self, title):super().__init__(f"图书已存在:{title}")self.title = titleclass InvalidBookError(LibraryError):"""无效图书异常"""def __init__(self, title, reason):super().__init__(f"无效图书:{title},原因:{reason}")self.title = titleself.reason = reasonclass Book:def __init__(self, title, author, year):self.title = titleself.author = authorself.year = yearclass Library:def __init__(self):self.books = {}def add_book(self, book):if book.title in self.books:raise BookAlreadyExistsError(book.title)if not book.title or not book.author or not book.year:raise InvalidBookError(book.title, "信息不完整")self.books[book.title] = bookdef remove_book(self, title):if title not in self.books:raise BookNotFoundError(title)del self.books[title]def get_book(self, title):if title not in self.books:raise BookNotFoundError(title)return self.books[title]def list_books(self):return list(self.books.values())def log_activity(func):def wrapper(*args, **kwargs):try:result = func(*args, **kwargs)return resultexcept LibraryError as e:print(f"图书馆操作异常:{e}")return Nonereturn wrapper@log_activity
def main():library = Library()# 添加图书try:book1 = Book("Python编程", "Guido van Rossum", 2020)library.add_book(book1)except LibraryError as e:print(f"添加图书时发生异常:{e}")try:book2 = Book("", "Unknown Author", 2021)library.add_book(book2)except LibraryError as e:print(f"添加图书时发生异常:{e}")# 列出图书print("当前图书列表:")for book in library.list_books():print(f"标题:{book.title}, 作者:{book.author}, 出版年份:{book.year}")# 获取图书try:book = library.get_book("Python编程")print(f"获取图书:标题:{book.title}, 作者:{book.author}, 出版年份:{book.year}")except LibraryError as e:print(f"获取图书时发生异常:{e}")try:book = library.get_book("Java编程")print(f"获取图书:标题:{book.title}, 作者:{book.author}, 出版年份:{book.year}")except LibraryError as e:print(f"获取图书时发生异常:{e}")# 删除图书try:library.remove_book("Python编程")print("图书'Python编程'已删除")except LibraryError as e:print(f"删除图书时发生异常:{e}")try:library.remove_book("Java编程")print("图书'Java编程'已删除")except LibraryError as e:print(f"删除图书时发生异常:{e}")if __name__ == "__main__":main()

6.2 示例解释

  1. 自定义异常类

    • LibraryError是图书馆通用异常的基类。
    • BookNotFoundErrorBookAlreadyExistsErrorInvalidBookError分别表示图书未找到、图书已存在和无效图书的异常。
    • 这些异常类通过继承LibraryError实现,方便在图书管理系统中统一处理。
  2. Book 类

    • Book类表示一本图书,包含标题、作者和出版年份等属性。
  3. Library 类

    • Library类实现了图书的添加、删除、获取和列出操作,并

在适当的地方抛出自定义异常。

  1. log_activity 装饰器

    • log_activity装饰器用于捕获和记录图书管理系统中的操作异常。
  2. main 函数

    • main函数是程序的入口,展示了如何在图书管理系统中使用自定义异常来处理各种错误情况,包括添加、删除和获取图书的操作。

6.3 执行结果

在这里插入图片描述

7. 总结

本文详细介绍了Python自定义异常的基本概念、定义方法、使用场景以及最佳实践。通过自定义异常,开发者可以提供更具体和有意义的错误信息,将错误处理逻辑分离,保持代码的清晰性和可维护性。最后,我们通过一个综合详细的例子展示了如何在实际应用中使用自定义异常来实现一个简单的图书管理系统。希望本文对您理解和应用Python的自定义异常有所帮助。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1538161.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树——数据结构

这次我们来学习一下数据结构中的二叉树 1. 二叉树的概念及结构 1.1 二叉树的定义 定义&#xff1a;所有结点的度小于等于2的树。 上图中可以看出 二叉树不存在度大于2的结点二叉树的子树有左右之分&#xff0c;次序不能颠倒&#xff0c;因此二叉树是有序树。 任意二叉树都…

2024年适合培训服务企业的7款CRM盘点

培训服务行业在线索管理、客户管理、数据分析、项目管理、师资管理和课程管理等方面&#xff0c;使用CRM可以事半功倍&#xff0c;最重要的是&#xff0c;可以用数据说话&#xff0c;找到降本增效的方向。 下面对培训服务行业常用测CRM做个盘点&#xff0c;包括国内比较头部的…

米壳AI:跨境电商必备:不损失原图的图片翻译工具!

嘿&#xff0c;跨境电商的小伙伴们&#xff01; 今天来聊聊如何突破语言壁垒&#xff0c;让你的商品在国际市场上大放异彩。 随着 “一带一路” 战略的不断推进&#xff0c;跨境电商的发展势头愈发强劲。然而&#xff0c;语言障碍却成为了跨境交易中的一大难题。别担心&#x…

ppt组织结构图怎么增加分支?

在使用ppt里边的SmartArt来制作组织结构图的时候&#xff0c;我们发现里边的图形不够用&#xff0c;需要增加分支&#xff0c;这也就是大家近期问的ppt组织结构图怎么增加分支。今天设计学徒自学网小编就把具体的操作步骤分享给大家了&#xff0c;希望能帮助你们&#xff01; …

RFID技术实现消防物资消防车无感化智能管理设计方案

在消防工作中&#xff0c;物资管理的高效性与准确性直接关系到救援行动的成败&#xff0c;传统的消防物资管理方式主要依赖人工记录和定期盘点&#xff0c;这种方式存在着诸多弊端。首先&#xff0c;人工记录容易出现错误&#xff0c;数据的准确性难以保证。例如&#xff0c;在…

制作U盘安装操作系统(启动盘、系统盘、Windows、Linux)

第一种&#xff08;Windows&#xff09; 官网windows制作启动盘 1. 打开Win11下载官网 下载 Windows 11https://www.microsoft.com/zh-cn/software-download/windows11 2. 下载制作操作系统工具 这里不要下载错了 3. 启动工具 选择U盘&#xff0c;选择你的U盘即可&#xf…

TASK-CUSTOMIZEDMASKED AUTOENCODERVIA MIXTURE OF CLUSTER-CONDITIONAL EXPERTS

发表于&#xff1a;ICLR 2023 notable top 25%&#xff08;相当于spotlight) 推荐指数: #paper/⭐⭐⭐ 论文链接: Task-customized Masked Autoencoder via Mixture of Cluster-conditional Experts | OpenReview poster链接&#xff1a;ICLR 2023 Task-customized Masked Auto…

人类行为识别系统源码分享

人类行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

使用streaming-json-py插件处理JSON数据流:详细指南

目录 一、streaming-json-py简介 二、安装与配置 三、基本使用 示例1:处理不完整的JSON对象 示例2:处理不完整的JSON数组 四、高级用法 实时数据流分析 日志处理 五、性能优化与错误处理 六、总结与展望 在数据驱动的现代社会,实时处理数据流已成为许多应用和服务…

Linux·权限与工具-git与gdb

1. git工具 git是一款软件&#xff0c;发明它的人同时发明了Linux操作系统&#xff0c;也就是大名鼎鼎的Linus Torvalds 林纳斯托瓦兹。后来人们把git软件包装&#xff0c;产生了github、gitee等平台。 git产生的初衷就是便于进行多人协同管理&#xff0c;同时它还可以用来将本…

GB/T28181-2022相对老版本有哪些变动?

GB/T28181-2022新版概述 GB/T28181-2022是《公共安全视频监控联网系统信息传输、交换、控制技术要求》的国家标准&#xff0c;该标准在2022年12月30日发布&#xff0c;并于2023年7月1日正式实施。以下是关于GB/T28181-2022的详细解析&#xff1a; 一、标准概述 GB/T28181-20…

2024/9/18 模型的存储与读取

一、模型的存储与读取 主要涉及到torch.save和torch.load函数 新建两个python文件&#xff1a; 1.在model_save文件中保存模型(方式一)和模型参数(方式二) 2.在model_load文件中读取模型(方式一)和模型参数并装载模型(方式二)

海外绿色农业果蔬投资系统可以二开多语言

食品安全已经是全球非常重视&#xff0c;关于农业方面的基础建设投资都在大力推进&#xff0c;做一个绿色农业果蔬投资是一个非常不错的。希望这个系统能对你有很大的帮助&#xff01;

三菱变频器变更电流最大输入(20mA 初始值)时的频率(60Hz初始值)

变更最高频率。变更示例 在4~ 20mA 输入频率设定器中&#xff0c;将 20mA 时的频率从 60Hz(初始值)变更为 50Hz。 输入 20mA 电流时调整为输出 50Hz。 将Pr.126 设定为“50Hz” NOTE 4mV 时的频率设定可通过校正参数 C5 设定。 其他的频率设定电流增益的调整方法&#xff0c;还…

泛微E-Mobile client/cdnfile 任意文件读取漏洞复现

0x01 产品简介 泛微E-Mobile是一款由泛微网络科技股份有限公司开发的移动办公产品,该产品专门为手机、平板电脑等移动终端用户设计,旨在提供便捷、高效的移动办公体验。适用于企业高管和有移动办公需求的业务部相关员工使用,特别适合于已有内部OA系统的大中型企业机构,尤其…

HBuilder无法打开微信开发者工具

配置微信开发工具路径之后&#xff0c;HBuilder无法打开微信开发者工具 使用HBuilder打开微信开发者工具的配置&#xff0c;官网有 运行至微信模拟器控制台报错 这个时候就需要打开微信开发者工具进行安全设置了

国外问卷调查怎么做的,新手怎么开始?

既然你准备进入这个行业&#xff0c;就应该明白一件事&#xff1a;这个项目&#xff0c;本质就是网络搬砖。 也就是你搬的越多、越快&#xff0c;就赚得越多。 做一份问卷&#xff0c;比如2美元&#xff0c;做50份&#xff0c;就是100美元&#xff0c;也就是700元左右。 月入…

好用的超声波清洗机有哪些?精选四大爆款品牌汇总

随着时代的发展及生活水平的提升&#xff0c;珠宝饰品、眼镜等个人物品日益普及至千家万户。然而&#xff0c;这些贵重小物在日常存放中难免会积累微尘与隐形细菌&#xff0c;无形中可能对我们的健康产生潜在影响。鉴于细菌的微小难察&#xff0c;超声波清洗机应运而生&#xf…

C++:日期类的实现

目录 一、前言 二、头文件 三、各个函数的实现 打印、检查日期及获取日期 、、-、-、 、<、<、>、>、 &#xff01; 日期-日期 >>、<< 一、前言 前面几篇讲了关于类和对象的一些知识&#xff0c;本篇就来实现一下前面用到的日期类。 二、头文…

Linux文件IO-基础知识了解及文件描述符

1、简介 本章给大家介绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、Outout&#xff09;&#xff0c;文件 I/O 指的是对文件的输入/输出操作&#xff0c;说白了就是对文件的读写操作&#xff1b;Linux 下一切皆文件&#xff0c;文件作为 Linux 系…