Python内建异常类的一个应用问题
本文最后更新于 481 天前,其中的信息可能已经有所发展或是发生改变。

今天写代码,发现一件很有意思的事情,关于内建异常类的

给大家在shell里面演示一下。希望大家能注意。

>>> id(ZeroDivisionError)
1915353752
>>> dir(ZeroDivisionError)
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'with_traceback']
>>> print ("以上是Python的内建异常类ZeroDivisionError.")
以上是Python的内建异常类ZeroDivisionError.
>>> class ZeroDivisionError(Exception):
...   def __init__(self):
...     self.addmsg = "测试消息"
...   def show(self):
...     return self.addmsg
...
>>> id(ZeroDivisionError)
51808496
>>> dir(ZeroDivisionError)
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', '__weakref__', 'args', 'show', 'with_traceback']
>>> print ("这里重写了ZeroDivisionError类.")
这里重写了ZeroDivisionError类.
>>> try:
...   raise ZeroDivisionError
... except Exception as error:
...   print (id(error))
...   print (dir(error))
...
51832232
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', '__weakref__', 'addmsg', 'args', 'show', 'with_traceback']
>>> try:
...   3 / 0
... except Exception as error:
...   print (id(error))
...   print (dir(error))
...
51854384
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'with_traceback']

在这个实验中,我手动的重写了Python内建的除数不能为0的异常类 – ZeroDivisionError,使其拥有一个属性一个方法,并试图引发这个异常。

很显然:在以上的试验中我们可以看出来,Python会在异常发生(或者被抛出之后)在捕捉的过程中建立一个临时的变量,这个局部变量在try块内有效,变量名为你指定的捕获名称。而这个变量指向了实例化的一个异常类。

但是令人不解的是:在解释器启动之初,Python会为它内建的异常类分配内存并创建引用,但是如果我们手动的重写与内建异常类同名的异常类,则在主动抛出异常时会调用用户定义的异常;而在发生错误时,却会调用内建的异常。这是我们需要注意的。

当然,也没人会重定义内建异常类是吧·······

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇