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.rhkb.cn/news/426220.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】涉及string类的经典OJ编程题

【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数&#xff08;atoi&#xff09;解法一&#xff1a;&#xff08;不用long&#xff09;完整代码&#xff1a;解法二&#xff1a;&#xff08;用long&#xff09; 二.字符串相加代码实现&#xff08;含注释&#xff09;&a…

【UE5】使用2DFlipbook图作为体积纹理,实现实时绘制体积纹理【第一篇】

这是一篇对“Creating a Volumetric Ray Marcher-Shader Bits”的学习心得 文章时间很早&#xff0c;因此这里针对UE5对原文做出兼容性修正&#xff08;为避免累赘不做出注明。链接如上&#xff0c;有需要自行学习&#xff09; 以及最后对Custom做可能的蓝图移植&#xff0c;做…

【Android Studio】2024.1.1最新版本AS调试老项目(老版AS项目文件、旧gradle)导入其他人的项目

文章目录 实验环境开始修改项目文件1. 删除.gradle及.idea两个文件夹2.修改SDK路径&#xff08;本地SDK存放路径&#xff09;3.修改gradle版本4.修改gradle插件版本&#xff08;AGP&#xff09;5.修改JDK版本 实验环境 Android Studio 版本 项目版本 开始修改项目文件 1. 删…

docker可视化管理工具推荐!docker.ui

正式介绍之前&#xff0c;可以看下这款工具的截图&#xff0c;开源地址在文末提供&#xff1a; docker.ui&#xff1a;一个可视化的docker管理工具 docker是一个开源的容器平台&#xff0c;可以让开发者和运维人员快速地构建、运行和部署应用。 docker的优势在于它可以实现应…

机器人的动力学——牛顿欧拉,拉格朗日,凯恩

机器人的动力学推导方法有很多&#xff0c;常用得有牛顿&#xff0c;拉格朗日&#xff0c;凯恩等方法&#xff0c;接下来&#xff0c;简单说说他们之间的使用。注&#xff1a;这里不考虑怎么来的&#xff0c;只说怎么应用。 参考1&#xff1a;4-14动力学分析方法-牛顿—欧拉方…

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…

【数据仓库】数据仓库常见的数据模型——维度模型

文章部分图参考自&#xff1a;多维数据模型各种类型&#xff08;星型、雪花、星座、交叉连接&#xff09; - 知乎 (zhihu.com) 文章部分文字canla一篇文章搞懂数据仓库&#xff1a;四种常见数据模型&#xff08;维度模型、范式模型等&#xff09;-腾讯云开发者社区-腾讯云 (ten…

Comsol 利用多孔材料填充复合吸声器,拓宽低频完美吸声

参考文献&#xff1a;Cheng B , Gao N , Huang Y ,et al.Broadening perfect sound absorption by composite absorber filled with porous material at low frequency:[J].Journal of Vibration and Control, 2022, 28(3-4):410-424.DOI:10.1177/1077546320980214. 为了提高低…

MySQL基于GTID同步模式搭建主从复制

系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…

C语言程序设计(进阶)

行到水穷处&#xff0c;坐看云起时。 中秋快乐呀&#xff01; 数据在内存中的存储 1.数据类型的介绍 &#xff08;1&#xff09;基本的内置类型&#xff1a; char //字符数据类型 short //短整型 int //整型 long //长整型 …

【零基础速领】全套AI大模型入门指南(学习路线+PDF文档+面试)

已经有越来越多的人开始认识到学习AI的重要性了&#xff01;可能是自主的认知&#xff0c;也可能是被身边的人卷的。总之&#xff0c;可能已经没有人不知道人工智能这个概念了&#xff0c;可能人人都已知道ChatGPT了&#xff0c;哪怕他没有用过。 ChatGPT发布后&#xff0c;很…

nginx实现https安全访问的详细配置过程

文章目录 前言什么是 HTTP&#xff1f;什么是 HTTPS&#xff1f;HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的&#xff1f;配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP&#xff1f; HTTP&#xff0c;全称为“超…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

【Linux】探索文件I/O奥秘,解锁软硬链接与生成动静态库知识

目录 1、C文件接口 1.1什么是当前路径&#xff1f; 1.2程序默认打开的文件流&#xff1a; 2、系统文件I/O 2.1.接口介绍&#xff1a; 2.1.1open&#xff1a; 参数讲解; flags如何实现一个参数就可以有多个参数传参的效果&#xff1f; open函数的返回值&#xff1a; 3…

CentOS入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是基于红帽企业版Linux&#xff08;RHEL&#xff09;的免费开源Linux发行版&#xff0c;它以稳定、安全和可靠性著称&#xff0c;被广泛应用于服务器环境。以下是CentOS入门时你必须掌握的基础知识。 1. C…

【技术调研】三维(3)-ThreeJs-几何体、材质、贴图、灯光及案例

几何体 ​ 几何体是构建模型的基础,模型=几何体+材质。threejs中已内置了很多几何体。这里不一一介绍。 BufferGeometry 是面片、线或点几何体的有效表述。包括顶点位置,面片索引、法相量、颜色值、UV 坐标和自定义缓存属性值。使用 BufferGeometry 可以有效减少向 GPU 传输…

报名开启!第七届“强网”拟态防御国际精英挑战赛正式官宣

向新向未来&#xff0c;顶赛启新篇&#xff01;第七届“强网”拟态防御国际精英挑战赛正式官宣&#xff0c;暂定于2024年11月18日至21日在南京举办。 本届大赛旨在促进内生安全理念和技术在实践中的应用&#xff0c;吸引更多数字化产业加入内生安全产业生态圈&#xff0c;推动…

基于C++实现(MFC)职工工作量统计系统

题目&#xff1a;职工工作量统计系统设计 1、问题描述 职工包括姓名、职工号、性别、年龄、所在部门、联系方式等信息。 工作量包括职工号、完成的产品数量等信息。 该设计系统能够对职工的工作量进行统计&#xff0c;并排出名次。注意&#xff0c;一个职工的工作量是可以多次…

微信支付开发-前端api实现

一、操作流程图 二、代码实现 <?php /*** 数字人答题业务流* User: 龙哥三年风水* Date: 2024/9/11* Time: 14:59*/ namespace app\controller\shuziren; use app\controller\Base; use app\model\param\QuestionParam as PQPModel; use app\model\answer\QuestionBank; u…

【Java】【力扣】83.删除排序链表中的重复元素

题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&#…