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

server/2024/10/23 8:14:38/

引言

前面介绍了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/server/134119.html

相关文章

C++贪心算法

贪心算法 贪心的基本原理:每一步都选择局部最优解而尽量不考虑对后续的影响,最终达到全局最优解。 贪心的局限性:贪心算法不能保证获得全局最》解,但在某些问题上具有高效性。 贪心的特征:贪心选择性质()、最优子结构性质(根据我的观察,很多…

复写零--双指针

一&#xff1a;题目描述 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理分析 三&#xff1a;代码编写 void duplicateZeros3(vector<int>& arr) {int dest -1, cur 0, n arr.size();//1.找到要复写的最后一个数字while …

构建高效在线考试平台:Spring Boot与JavaWeb的融合

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现…

MOE混合专家模型总结(面试)

1. MOE介绍 MOE&#xff0c;全称Mixture of Experts&#xff0c;即混合专家模型&#xff0c;是一种基于神经网络领域开发的集成学习技术和机器学习方法。它最早于1991年被提出&#xff0c;最初应用于计算机视觉领域&#xff0c;目前在自然语言处理领域也备受推崇。MOE模型通过…

高并发负载均衡——nginx与lvs

一、企业级web项目架构 一、企业级web项目架构图 二、架构分析 客户端通过企业防火墙发送请求在App服务器如tomcat接收客户端请求前&#xff0c;面对高并发大数据量访问的企业架构&#xff0c;会通过加入负载均衡主备服务器将请求进行转发到不同web服务其中。服务器通过访问数…

CTF(二)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类反序列化题目unseping。。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 反序列化漏洞&#xff1a;反序列化漏洞&#xff08;二&#xff09;_fst反序列化 rocksdb 字段值错误-CSDN博客 打开后可以看到&#xff1…

《探索 Python 音频利器:sounddevice》

一、sounddevice 简介 Sounddevice 是一个强大的 Python 音频处理库&#xff0c;它为开发者提供了对 PortAudio 库的 Python 绑定&#xff0c;从而实现了在 Python 环境中播放和录制音频数据的功能。 这个库具有诸多优势。首先&#xff0c;它具有跨平台性&#xff0c;无论是在…

【论文阅读】DL-SRIR综述2023

0. 摘要 SISR与DL的介绍 单图像超分辨率(SISR)是计算机视觉的一个重要研究领域,其目的是从低分辨率(LR)图像中恢复清晰、高分辨率(HR)图像。 随着深度学习理论和技术的快速发展,深度学习被引入到图像超分辨率(SR)领域,并在许多领域取得了远远超过传统方法的成果。 本文框架…