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

引言

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

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

1、为什么要自定义异常

2、如何自定义异常

为什么要自定义异常

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

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

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

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

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

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

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

如何自定义异常

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

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

直接看代码:

class MyException(Exception):
    pass


def just_raise():
    raise MyException('这就是个没有任何用的自定义异常')


if __name__ == '__main__':
    print('异常捕获前')
    try:
        just_raise()
    except MyException as e:
        print(e)
    print('异常捕获后')

执行结果:

378ce37c4028344d98789f26dadee289.jpeg

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

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

class MyException(Exception):
    def __init__(self, msg, error_code, context):
        super().__init__(msg)
        self.error_code = error_code
        self.context = context


def 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用InternVL、LMDeploy和GTE搭建多模态RAG系统

如何将视觉大模型(VLM)与 多模态RAG 结合起来,创建服装搜索和搭配推荐!本文展示了InternVL模型在分析服装图像和提取颜色、款式和类型等关键特征方面的强大功能。 InternVL2是国内首个在MMMU(多学科问答)上突破60的模型&#xff0…

MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。

2024-10-10,由电信研究所、里斯本大学等联合创建MT-Pref数据集,它包含18种语言方向的18k实例,覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验,我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…

【云从】十、常见安全问题与云计算的计费模式

文章目录 1、常见安全问题1.1 DDoS攻击1.2 病毒攻击1.3 木马攻击1.4 代码自身漏洞 2、安全体系3、云计算的计费模式4、常见云产品的计费方案5、云产品计费案例 1、常见安全问题 1.1 DDoS攻击 通过分布在各地的大量终端,同时向目标发送恶意报包,以占满目…

【C++贪心】1536. 排布二进制网格的最少交换次数|1880

本文涉及知识点 C贪心 决策包容性 LeetCode1536. 排布二进制网格的最少交换次数 给你一个 n x n 的二进制网格 grid,每一次操作中,你可以选择网格的 相邻两行 进行交换。 一个符合要求的网格需要满足主对角线以上的格子全部都是 0 。 请你返回使网格满…

精通CSS布局:探索经典的网页布局样式和技术

一、经典两列布局样式 1.概念 许多网站有一些特点,如页面顶部放置一个大的导航或广告条,右侧是链接或图片,左侧放置主要内容,页面底部放置版权信息等。 一般情况下,页面布局的两列都有固定宽度,而且从内容…

7.hyperf安装【Docker】

- 前言:为了与容器中的mysql通信,先运行mysql,再使用 --link关联 一、 拉取 php版本为8.2的版本 8.3的版本,启动框架时,报错。 docker pull hyperf/hyperf:8.2-alpine-vedge-swoole-slim二、 运行hyperf环境容器 --l…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available(基本可用)2_Soft State(软状态)3_Eventually Consistent(最终一致性)4_总结 1、理论基础 在计算机…

解决k8s集群中安装ks3.4.1开启日志失败问题

问题 安装kubesphere v3.4.1时,开启了日志功能,部署时有三个pod报错了 Failed to pull image “busybox:latest”: rpc error: code Unknown desc failed to pull and unpack image “docker.io/library/busybox:latest”: failed to copy: httpRead…

Java项目-基于springboot框架的学习选课系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

【Petri网导论学习笔记】Petri网导论入门学习(八) —— 1.6 系统的Petri网模型

导航 1.6 系统的Petri网模型例 1.6 化学反应例 1.7 进程的通信协议例 1.8 P/V操作例 1.9 临界段互斥问题例 1.10 生产者/消费者问题例 1.11 哲学家就餐问题 1.6 系统的Petri网模型 理论的目的在于应用,接下来是一些关于用Petri网标识离散事件系统的例子 这里就直接…

C++ 游戏开发:从基础到进阶

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目,有博客、交流,面试学习,练题等模块。 项目的背景主要是我们想要通过面试题的分类,难度,打标,来评估员工的技术能力。同时在我们公司招聘季的时候,极大的…

平衡相图在矿物加工中的广泛应用,含材料设计、性能预测等

平衡相图是描述在特定温度和压力下,不同相(如固体、液体、气体等)之间平衡关系的图表。在矿物加工领域,通过分析相图可以详细了解不同成分的矿物在特定温度和压力条件下的相变行为,从而设计出更高效的提取和分离方法&a…

EasyExcel自定义下拉注解的三种实现方式

文章目录 一、简介二、关键组件1、ExcelSelected注解2、ExcelDynamicSelect接口(仅用于方式二)3、ExcelSelectedResolve类4、SelectedSheetWriteHandler类 三、实际应用总结 一、简介 在使用EasyExcel设置下拉数据时,每次都要创建一个SheetWr…

文件误删并清空回收站:全面解析与高效恢复策略

一、文件误删并清空回收站的遭遇 在日常使用电脑或移动设备的过程中,我们难免会遇到一些令人懊恼的数据丢失问题,其中文件误删并清空回收站便是最为常见的一种。当你不小心删除了某个重要文件,并且随后又毫不留情地清空了回收站,…

flutter camera 插件相机不占满屏幕的问题

当 CameraPreview 超出屏幕范围时,可以通过以下几种方法来处理超出部分被裁剪的问题: 使用 FittedBox:FittedBox 可以自动调整子组件的大小和比例,使其适应父容器。使用 BoxFit 属性:在 FittedBox 中使用不同的 BoxFi…

Rust初踩坑

一、下载 到官网https://www.rust-lang.org/zh-CN/tools/install下载你需要的版本 二、安装 执行rustup-init 文件,选择1 按提示直到安装完成 可以通过以下命令测试: rustc -V # 注意的大写的 V cargo -V # 注意的大写的 V三、在VScode中…

python + mitmproxy 爬手机app (1)

起因, 目的: 想爬手机上某鱼。 mitmproxy 简介: 一句话: mitmproxy 就是中间人攻击. (只不过, 你安装,就代表你愿意承担风险。)源码:https://github.com/mitmproxy/mitmproxy文档: https://mitmproxy.org/ 安装过程: 见聊天记…

【Vue】Vue3.0(十五)Vue 3.0 中 hooks 的概念

🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月22日21点50分 背景:在一些情况下,前台的组件是可以复用的,那这些复用的对象和数据,为…

cnn_lstm_kan模型创新实现股票预测

获取更多完整项目代码数据集,点此加入免费社区群 : 首页-置顶必看 1. 项目简介 A002-cnn_lstm_kan模型创新实现股票预测项目旨在通过结合卷积神经网络(CNN)、长短期记忆网络(LSTM)以及知识注意网络&#…