94、Python之异常:自定义异常以满足业务个性化需求

news/2024/10/23 7:46:58/

引言

前面介绍了Python中内置的异常类的继承体系,通常来说,这些异常类已经能够满足各种异常的场景需要。但是,有时还是需要自定义异常,来满足一些个性化的需求,以及更加可控、精细化的异常管理。

本文就来介绍一下如何通过自定义异常来满足业务的个性化需求,主要内容有:

1、为什么要自定义异常

2、如何自定义异常

为什么要自定义异常

每个技术特性,没有绝对的好与坏,都有其适用的场景。所以,前面的文章中,笔者也一直在提及,学习技术特性,关键是找到实际工作中的适用场景,否则,只是单纯地记忆一些编程语言的语法,其实是没有太大意义的。

内置异常类的体系已经很丰富了,能够满足绝大部分的异常管理的场景需求。但是,自定义异常,还是有其存在的必要性的。

1、提高代码的可读性和可维护性:自定义异常可以使代码更加清晰和可读,通过自定义特定的异常类型,可以更加明确地描述不同的错误情景,从而使得代码更容易理解和维护。

2、更精确的异常管理:通过自定义异常类,可以更加精确地描述、捕获和处理特定类型的异常,从而与通用的内置异常类型区分开来,避免错误捕获不相关的异常。

3、提供更多的上下文信息:自定义异常类中可以包含更多的信息,比如自定义的错误代码、详细的错误消息、或者其他业务上下文相关的数据等,从而通过更加完整的上下文信息进行问题的定位与调试。

4、提供更好的用户体验:通过自定义异常,还可以提供更加有意义或者对用户更加友好的错误信息,而不是显示业务人员或者终端用户看不懂的技术细节或通用的错误信息。

基于以上几点,可以看出自定义异常的优点及适用场景,如果系统中更多的是通用的异常处理,没有特殊的业务领域相关的异常,则完全不需要进行自定义异常。

如何自定义异常

回答了为什么要自定义异常的问题,接下来就来具体看一下,我们在Python中如何来自定义异常。

在Python中,自定义异常的通常的方法就是创建一个类,并继承自内置的异常类,通常是继承自Exception类。

直接看代码:

python">class MyException(Exception):passdef just_raise():raise MyException('这就是个没有任何用的自定义异常')if __name__ == '__main__':print('异常捕获前')try:just_raise()except MyException as e:print(e)print('异常捕获后')

执行结果:

378ce37c4028344d98789f26dadee289.jpeg

当然,这样一个自定义异常,是没有太大的意义的。

我们通常需要增加一些补充信息,以便于进行问题的定位及调试,比如这样的异常:

python">class MyException(Exception):def __init__(self, msg, error_code, context):super().__init__(msg)self.error_code = error_codeself.context = contextdef just_raise(arg1, arg2):context = {'arg1': arg1, 'arg2': arg2}raise MyException('这是个带有上下文信息的自定义异常', 501, context)if __name__ == '__main__':print('异常捕获前')try:just_raise('张三', 18)except MyException as e:print(e)print(e.error_code)print(e.context)print('异常捕获后')

执行结果:

254cc1c99d1c90935b15d36285a2a974.jpeg

从执行结果中,我们可以看到在自定义异常中,我们可以根据需要,进行相关异常属性的扩充,从而实现更加精确的异常定位与管理。

基于上面的内容,简单总结一下自定义异常的常规做法:

1、自定义类,并继承Python内置异常类,通常是Exception,也可以是其他更加具体的内置类,比如ValueError等。

2、根据需要,在自定义的异常类中,添加需要的相关信息,比如自定义的错误代码、异常上下文环境信息等。

3、在相关的数据校验或者其他可能产生异常的代码中,添加抛出自定义异常的代码。

4、在相关的调用端代码中,添加对自定义异常的捕获、处理逻辑。

总结

本文简单介绍了自定义异常的优点及适用场景,然后通过代码实例演示了在Python中自定义异常的方法,然后总结出自定义异常及使用的完整的步骤。

以上就是本文的全部内容了,感谢您的拨冗阅读,希望对您有所帮助。

e8ec5beb74e2bb19ec0f28cb99f9dff4.jpeg


http://www.ppmy.cn/news/1541264.html

相关文章

高效特征选择策略:提升Python机器学习模型性能的方法

高效特征选择策略:提升Python机器学习模型性能的方法 目录 🔍 特征选择的重要性📊 相关性分析🔄 递归特征消除 (RFE)🌳 基于模型的特征选择 1. 🔍 特征选择的重要性 特征选择在机器学习中至关重要&#…

工商银行大数据技术及应用白皮书2024

版权说明 本⽩⽪书版权属于中国⼯商银⾏软件开发中⼼, 并受法律保护。转载、 摘编或利⽤其它⽅式使⽤本⽩⽪书⽂字或者观点的,应注明“来源:中国⼯ 商银⾏软件开发中⼼”。违反上述声明者,我们将追究其相关法律责任。 第⼀章 概述

MySQL的 主从同步

1. 概述 MySQL 主从同步(Replication)是一种数据备份和灾难恢复的解决方案,同时也可以用于负载均衡和读写分离。通过主从同步,可以将一个 MySQL 数据库服务器(主服务器)的数据实时复制到另一台或多台 MySQ…

如何在 HarmonyOS NEXT 中使用 @Builder 装饰器优化 UI 组件的复用?

摘要 在鸿蒙 NEXT 开发中,Builder 装饰器是一种轻量级的 UI 元素复用机制,它允许开发者将重复使用的 UI 元素抽象成一个方法,并在 build() 方法中多次调用,以实现 UI 结构的复用。以下是如何使用 Builder 装饰器来优化 UI 组件复…

一篇文章入门Pytest!

目录 一、安装 二、语法 三、执行 四、前后置setup/teardown 五、fixture 六、数据驱动 七、报告 一、安装 需要安装的库 pytest pytest-html 生成HTML格式的测试报告 pytest-xdist 用例分布式执行,多CPU分发 pytest-ordering …

计算机毕业设计Python+Spark知识图谱课程推荐系统 课程用户画像系统 课程大数据 课程爬虫 课程大屏 mooc慕课推荐系统 大数据毕业设计

《PythonSpark知识图谱课程推荐系统》开题报告 一、研究背景与意义 随着互联网技术的快速发展,在线教育平台已成为人们获取知识、提升技能的重要途径。然而,面对海量的课程资源,用户往往难以快速找到符合自己兴趣和需求的课程。传统的课程推…

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用?二、为什么 Redis 要使用 IO 多路复用?三、Redis 如何实现 IO 多路复用?四、IO 多路复用的核心机制:epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…

Scala的内部类

Scala中的内部类(Inner Class)是指定义在另一个类的内部的类。 内部类可以访问外部类的成员(包括私有成员),并且可以与外部类的实例紧密地绑定在一起。 内部类在Scala中非常有用,尤其是在需要封装特定功能…