首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在Python中保留自定义异常

在Python中,我们可以自定义异常来处理特定的错误情况。然而,为了保持代码的一致性和可读性,Python的设计者决定不允许在自定义异常中保留自定义异常。

保留异常是指在自定义异常类中定义了__init__方法,并且该方法接受参数并将其保存为实例属性。这样做可能会导致一些问题,因为异常类在异常处理过程中可能会被序列化、传递或记录。如果异常类中包含了保留的属性,那么在这些操作中可能会出现意外的行为。

为了避免这种潜在的问题,Python规定自定义异常类应该继承自内置的Exception类或其子类,并且不应该定义任何保留的属性。相反,我们可以通过在__init__方法中接受参数并在异常实例中保存它们来传递额外的信息。

自定义异常的优势在于可以更好地组织和处理代码中的特定错误情况。通过定义自己的异常类,我们可以为不同的错误情况创建不同的异常类型,并在代码中使用try-except语句来捕获和处理这些异常。这样可以提高代码的可读性和可维护性,并使错误处理更加精确和灵活。

以下是一个示例,展示了如何定义和使用自定义异常类:

代码语言:txt
复制
class CustomException(Exception):
    pass

def divide(a, b):
    if b == 0:
        raise CustomException("Divisor cannot be zero")
    return a / b

try:
    result = divide(10, 0)
except CustomException as e:
    print(e)

在上面的示例中,我们定义了一个名为CustomException的自定义异常类,并在divide函数中使用它来处理除零错误。当除数为零时,我们抛出CustomException异常,并在try-except语句中捕获并处理它。

总结起来,尽管Python不允许在自定义异常中保留自定义属性,但我们仍然可以通过继承内置的异常类来定义自己的异常,并在异常实例中传递额外的信息。这样可以提高代码的可读性和可维护性,并使错误处理更加精确和灵活。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

自定义异常为什么性能差,来告诉你

那么在一个高并发的系统里,有哪些点是影响系统性能的呢,今天我们来讲其中一个点:自定义异常 如果对大家有所帮助,请给个【在看】和【点赞】 疯狂的异常 为什么异常会影响性能 首先给大家看一段JDK的Throwable...,这段方法暴露出两个问题 使用了synchronized修饰整个异常方法 将异常追踪信息放到了堆栈(想想JVM和线程) 异常种类 业务异常这些是我们自定义的、可以预知的异常,抛出这种异常并不表示系统出了问题...系统异常往往是运行时异常,比如数据库连接失败、IO 失败、空指针等,这种异常的产生多数表示系统存在问题,需要人工排查定位。...相信大家都接触过异常,对于业务异常,我们只需要简单的知道一个描述问题的字符串即可,栈追踪信息对我们的意义并不大。而对于系统异常,追踪信息才是排查错误不可或缺的参考。...大家试想,如果前端传的参数错了,系统里就抛出一个异常,那么在双十一的情况下一秒钟得抛出多少个异常呢? 问题思考 抛异常的时候是不是会被 synchronized 上同步锁? 需不需要线程去执行?

1.5K20

为什么建议你使用Python3.7.3?

作者: Lateautumn4lin 来源:云爬虫技术研究笔记 ---- 之前使用Python的环境一直是Python3.7.3的,一直使用的很正常,没有什么毛病,直到最近做一个图片下载器的时候发现了问题...这个问题在Python中比较常见,说明是本地的SSL验证出现了问题,一般在Requests的使用我们一般会这么进行处理: >>> import requests >>> session = requests.Session...解决一下 Goole了一下,发现其实不止一个人出现了这个问题,已经有老哥在Aiohttp的Issue里面提了相关的问题了,可以参考https://github.com/aio-libs/aiohttp...不过这个问题已经在Python3.7.4和3.8版本解决了。 ? 可惜的环境之前是3.7.3 我们知道了问题的解决办法,我们再去看看为什么会有这个问题?...大家要是有什么关于Python这两个版本的疑问可以尽情提出来!

2.1K30
  • 为什么建议你通过 Python 去找工作?

    这是读者“前进一点”在微信上问我的一个问题,当时给他的回复是“Python 挺火的,学 Python 就好。”但当我在 B 站上看了羊哥的一期视频后,深感懊悔,觉得自己给出的建议是不负责任的。...01、人工智能和机器学习人工智能和机器学习是 Python 应用的重头戏,但这方面的岗位对学历的要求非常高,高到我自己都应聘上,非常残酷。...04、Web 开发用 Python 做 Web 开发的大型互联网公司听说的不多,羊哥说豆瓣以前用的是 Python,现在也不用了。...很多培训机构夸赞 Python 在 Web 开发方面有着巨大的优势,开发效率高,速度快。嗯,其实觉得应该是因为 Python 的语法简单,容易教——这恐怕是主要原因啊,这样说会不会被社会毒打?...1)Robot Framework,主要用于测试驱动类型的开发与验收。2)Pytest,特点是开源、易学。3)PyUnit,针对单元测试的 Python 类自动化测试框架,收到 Junit 的启发。

    2.7K20

    为什么建议你通过 Python 去找工作?

    二哥,你好,是一名大专生,学校把 Python 做为主语言教给我们,但是也去了解过,其实 Python 门槛挺高的,所以我在自学 Java,但是现在并不清楚到底要不要全心的去学 Java,学校里的课程也越来越繁重...01、人工智能和机器学习 人工智能和机器学习是 Python 应用的重头戏,但这方面的岗位对学历的要求非常高,高到我自己都应聘上,非常残酷。...04、Web 开发 用 Python 做 Web 开发的大型互联网公司听说的不多,羊哥说豆瓣以前用的是 Python,现在也不用了。...很多培训机构夸赞 Python 在 Web 开发方面有着巨大的优势,开发效率高,速度快。嗯,其实觉得应该是因为 Python 的语法简单,容易教——这恐怕是主要原因啊,这样说会不会被社会毒打?...1)Robot Framework,主要用于测试驱动类型的开发与验收。 2)Pytest,特点是开源、易学。

    2.7K40

    Python 为什么没有 main 函数?为什么推荐写 main 函数?

    本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数? 在开始正题之前,先要来回答这两个问题:所谓的 “main 函数”是指什么?...每次看到这种不假思索的累赘代码,就觉得难受。为什么要写那行 if 语句呢?可能的话,应该拆分 main 函数,甚至不必封装成一个函数啊! 个人总结出以下的经验: 打破惯性思维,写出地道的代码。...推荐阅读:Python -m 的典型用法、原理解析与发展演变 推荐写if __name__ == '__main__'。首先,如果只有一个文件的话,因为不存在导出的可能,建议写。...最后,多文件的非入口文件也建议写,因为在非入口文件写这个判断,最大的作用就是写一些测试代码,但是测试代码应该分离出来,写到专门的目录或文件。...小结:本文首先解释了什么是 main 入口函数,以及为什么某些语言会强制要求写 main 函数;接着,解释了为什么 Python 不需要写 main 函数;最后则是针对某些人存在的惯性误区,分享了个人的四点编程经验

    2.4K31

    python自定义异常类的使用

    手动抛出异常关键词raise 异常的系统关键词exception 本节知识视频教程 自定义异常类 1.自定义类 2.继承系统的异常基类exception 3.自定义异常类的构造函数等方法进行处理 举例...: 自定义一个异常类MyException 这是一个最简单的异常类 class MyException(Exception): pass 案例:判断输入的情况 如果不是数值就抛出异常。...if not a.isdigit(): raise MyException("异常:输入的不是数值!") 总结强调: 1.自定义异常类。 2.掌握如何利用自定义异常类。...3.利用自定义异常类的构造方法,进行异常数值的提示。...本节知识源代码: #自定义异常类 class MyException(Exception): def __init__(self,a): self.a=a #最简单的异常类的使用

    1.8K30

    群友:事务异常也抛出了,为什么没catch到而回滚?

    上周,我们通过这篇文章《为什么catch了异常,但事务还是回滚了?》...异常不是最后也向外抛出了,那么为什么test4里catch没有能够捕获到呢?...其实这个问题并不难解释,下面就通过这篇文章,做个小实验,帮助大家进一步理解catch不到异常的原因! 如果你还不了解这篇文章在讨论什么,建议先看之前的两篇: 《来出个题:这个事务会不会回滚?》...所以,这里教大家一个简单方法来理解这次test4的catch为什么没有捕获异常。...所以,前文中我们跟踪的事务回滚所抛出的异常,其实是在test4的try-catch块执行完之后才抛出的,所以内部的这个catch是无法捕获异常的,这里完全就是catch了个寂寞。

    46920

    Python 为什么建议使用 time.sleep 实现定时功能?

    有时候,我们想实现一个非常简单的定时功能,例如:让一个程序每天早上 8 点调用某个函数 但我们又不想安装任何第三方库,也不会使用 crontab 或者任务计划功能,就想使用纯 Python 来实现 可能有同学会这样写代码...: import time import datetime def run(): print('是需要被每天调用的函数') def schedule(): target_time...但实际上,我们如果付出一点点微不足道的代价,我们就可以防止这种误差的发生,并且程序代码会变得更简单: import time import datetime def run(): print('是需要被每天调用的函数...这个次数并不多 但无论如何,专业的事情应该交由专业的工具来做;time.sleep 用来设置周期性的时间间隔可以,但它实际上不适合用来做定时任务 因为一个支持定时任务的库,例如:Python 的schedule...这不是我们简单用两三行 Python 代码就能完成的。

    4.4K10

    送给Python路途中迷茫的你们

    因此为了解决各版本间兼容的问题,于是就有了Virtualenv。Virtualenv作用是能在一台机器上创建多个Python虚拟环境,并且互相独立,互不影响。...3、进阶 1、面向对象编程: A:类和对象,B:属性和方法,C:继承,D:运算符的重载,E:Python与设计模式 2、异常处理与程序调试 A:Python异常,B:try...except的使用方法...,C:try...finally的使用方法,D:使用raise抛异常,E:自定义异常,F:assert语法的使用,G:异常信息,H:调试 3、数据库编程 A:Python下的其他数据库编程,B:sqlite...,为什么可以嵌套回调却偏要用 Promise ……。...以上是在数聚传媒工作及学习的经验总结,今天很高兴能在这里分享给大家。其实每个人学编程的道路都是不一样的,但大都殊途同归,没有迷路的人只有不能坚持的人。虽然听上去有点鸡汤,但是这是事实。

    46310

    从PEP-8学习Python编码风格

    的方法之间应当空一行。 方法的逻辑部分之间可以空一行。 关于原文件编码 Python3应当总是使用UTF-8。(Python2使用ASCII。)在使用了规定编码后不需要再声明文件编码。...如果名字与保留字有冲突,在最后加_。 私有变量和方法在最前加_,此时外部无法访问,但子类可以访问。 如果也希望子类访问,可以以__开头。此时无法用ClassName.__var访问 。...关于Python的下划线 Python的下划线用法有这么几种: a_:避免名字与保留字等的冲突。 _a:表示私有。只能在类内部和子类访问。 __a:只能在类内部使用。...__a__:Python内魔法对象的命名。其他情况不要这样命名。 关于getter(accessor)和setter(mutator) Python推荐使用类似于Java的getX和setX。...如果要操作的对象不能或不适合直接操作,可以使用内建的property方法自定义功能。

    50610

    Python知识梳理

    魔术方法是Python对象模型的重要部分。 可以动态的给对象/类型添加属性,若给类型添加属性,则该属性在已产生的实例上也是可见的: ? 异常与错误 Python异常与错误类间关系如下: ?...自定义异常只需继承Exception或各种Error类即可 异常处理 try: raise IOError('使用raise语句抛出异常') except IOError as err:...包/模块名的连字符(-) 双下划线开头并结尾的名称(Python保留, 例如init) 命名约定 所谓”内部(Internal)”表示仅模块内可用, 或者, 在类内是保护或私有的....掌握以上内容后,便可以用Python写些脚本,辅以其他第三方包或框架就可以干更多更复杂的事了。如,爬虫、数据分析、后端开发以及现在比较热的人工智能(其实,建议追热点的)。...用了一段时间的Python后,会觉着Python挺有意思的。 最后附上一张,个人总结的语言学习套路: ? 推荐阅读 人生苦短,为什么要用Python

    1K20

    信息论III:寻找序列化的极限

    msp兼容json是因为msp支持json的所有数据类型(4个基本类型及2个复合类型),除此之外msp还有自己的类型,包括纯粹二进制格式(也叫字节串)、datetime格式、自定义保留类型、变长基本类型...图中的测试数据是在python平台下进行的,为什么选择python平台而不是JS平台的原因文章结尾会说明ε=ε=ε=┏(゜ロ゜;)┛。...可以看到,python3下具有相同信息量的json和msp,msp的体积减少16.2%,解码速度大幅提升,只有编码消耗的时间更长,总的来说msp性能优于json。 可是为什么msp编码耗时更长呢?...保留类型前缀11111是为了预留给未来可能出现的新字符做准备,它们主要是长度超过4字节的字符们。 无论是10还是11111都违反了原则一,因为在恰当的位置出现这些前缀直接导致utf8解析失败。...minUTF-8这个名字是随便取的,仅仅代表一种可能的编码方案,并不一定能在实际中产生应用。 ----

    58010

    从零开始学习PYTHON3讲义(三)写第一个程序

    计算机语言也是这样,需要人和计算机都能看懂,Python就属于人跟计算机都能懂的语言,当然这样的语言还有很多种,几乎已经超过了人类之间沟通的语言总和。 ​ 能来学Python,你对语言肯定陌生。...print这个词在英文中是“打印”的意思,在课程的讲解也习惯上说“打印出来”,但实际上结果不明明白白的显示在屏幕上吗?...是Python保留字,实际还有冒号“:”也算是保留字的一种 line是函数名,x是传递到这个函数的参数 def line(x):这样的形式,包括def和line之间的空格,就是自定义函数的语法 y=3...上面的自定义函数,line是函数名。Python语言对自定义函数名的要求,跟变量名是相同的,也既:使用字母开始,后面可以有数字或者下划线,不能包含别的字符。...你可能感觉到奇怪,第一行输出3奇怪,奇怪的是为什么函数调用完成后,x的值又变回了10呢? 实际上,在testVar函数,x=3并不是再次对x进行赋值,而是在函数内重新定义了一个变量x。

    72130

    如何从抓包文件中分析慢请求

    sudo tcpdump -i lo port 6310 -w http.pcap-w 命令能让在服务器上抓到的包保留到 http.pcap 文件里,然后将这个文件从服务器上dump下来,用...图片这样便能在抓包文件中一下定位到慢http请求,我们甚至可以保存这个过滤器,以便下次抓不同包的时候能直接应用上这个过滤器,像下面这样操作图片bad Tcp无论是http time 还是tcp delta...time 都是发现延迟的利器,但要弄清楚究竟为什么发生延迟,还需要从tcp的行为去分析原因。...在wireshark异常的数据包可以通过tcp.analysis.flags 过滤器去筛选出来。...图片它可以筛选出异常的tcp数据包,比如重传,duplicated Ack ,找到异常数据包以后便可以快速的根据异常包的上下文去分析异常的原因了。

    65730

    cloudbase-init注意事项

    ,另外,新购机器的RunInstances接口的UserData(自定义数据)功能依赖cloudbase-init,如果删除,新购机器时如果想用UserData进行高级的初始化自定义设置就实现不了。...如果自己拿不定主意,建议保留。如果业务确实需要cloudbase-init,那得关注一些注意事项,下面的就是。...不要禁止光驱,会影响初始化、设置密码、设置hostname等流程②请在安全软件里信任cloudbase-init,否则,安全软件会拦截cloudbase-init,导致cloudbase-init相关的功能异常...或者环境变量有问题使得这些命令不能在cmd命令行或powershell命令行直接识别,也会导致问题,或者客户自己装了一套python加入了环境变量,而cloudbase-init本身自带了一套python...%SystemRoot%,所以把%SystemRoot%调上去了,然后就恢复正常了关于python环境变量的问题,建议配置全局python环境变量,一是影响cloudbase-init,更主要是对开发不利

    1.9K70

    Python 异常处理完整指南

    年前写了一篇文章 Python classic, static, class and abstract methods,现在似乎到了更新的时候,今天想来剖析和讨论 Python 异常。...正确的定义异常类 正如你可能已经知道了,在Python异常有可能在任何地方被抛出。最基本的异常类叫Exception ,它可用于程序的任何地方。...如果每个子系统都有一系列的异常通常就把他们放在这个子系统。这也是为什么推荐一个系统只放一个异常模块。这样myapp.exceptions就可能没必要了。...就像上面做的那样,将原始异常封装到用户自定义异常也是可行的.它使得我们可以很方便的查检原始异常....如果你想有对异常有更多的了解,Python未提到的部分,鼓励你阅读条件系统并挖出异常的泛化—希望我们未来有一天可以在Python中看到!

    1.8K100

    #21 Python异常

    这些错误在Python其实是异常,正确的处理异常会让程序跑起来得心应手,那么怎么来处理异常呢?Here we go!...Python异常 1.1 异常的名词解释 异常其实是一个Python对象,当Python无法正常处理程序时,就会实例化这个对象,从而抛出异常(表示一个错误) 1.2 异常捕捉 当程序出现异常时,如果处理则会终止程序的运行...age' is not defined 12 最后都得执行 Python异常,最常使用的就是try......except.........其实,Python,所有异常都有一个共同的基类BaseException,它包含所有的异常,常规异常的基类是Exception 当不清楚会出现什么异常的时候,直接捕捉Exception基本上都是可以捕捉到的...主动触发异常 3 except Exception as e: 4 print(e) 5 6 7 # 运行结果: 8 主动抛出异常 1.6 自定义异常 Python中所有的异常的基类都是BaseException

    1K20
    领券