Python——异常层级分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python——异常层级分析相关的知识,希望对你有一定的参考价值。

1、大部分的内置异常都是Exception的子类
2、Exception本身是从BaseException类继承过来的
3、因此所有的异常都是必须从BaseException类进行扩展
4、Exception是BaseException类的子类,而NameError是Exception的子类,NameError是BaseException类的子子类(或者叫间接子类)
5、那么,有没有异常类是直接从BaseException类继承的呢?有,那就是下面的两个
   SystemExit:
   这个异常被引发的规则是:不管程序是否正常退出,SystemExit异常都会被触发
   那么退出的动作,通常是在某段代码中调用了sys.exit()之后就会触发SystemExit异常
   SystemExit异常存在的意义是为了在程序退出之前清理代码,但无需显示的去处理它。
   清理代码的动作最好是放在try-finally中的finally里,finally语句是不管是否有异常都会执行
   
   KeyboardInterrupt:
   这个异常适用于命令行程序,他的引发规则是在键盘上按Ctrl+C,此时这个异常会被抛出
   
6、关于sys.exit()
   sys.exit() 引发一个 SystemExit异常,若没有捕获这个异常
   Python解释器会直接退出;捕获这个异常可以做一些额外的清理工作。
   0为正常退出,其他数值(1-127)为不正常,可抛异常事件供捕获。

   

7、查看其他异常类是否真的是继承于Exception

如查看NameError

技术分享图片

8、查看SystemExit和KeyboradInterrupt的父类

技术分享图片


9、异常层级关系图

技术分享图片


10、需要注意的是

  如果只是使用except:语句而没有指定任何类型的异常时,将会捕捉所有BaseException的子类

try:
    pass
except:
    pass


也就是说,这么做的话,会捕捉所有除了SystemExit和Keyboradinterrupt这两个特殊异常以外的其他异常,这是不推荐的做法

如果需要捕获任何异常(除了那两个特殊异常)推荐的做法是指明是except Exxception,看以下代码

try:
    pass
except Exception:
    pass


反过来,如果不想捕捉所有异常,那么指明BaseException,代码如下

try:
    pass
except BaseException:
    pass
#那么这么做的话,就仅仅只是处理那两个特殊异常了,因此是捕捉不到Exception


以上是关于Python——异常层级分析的主要内容,如果未能解决你的问题,请参考以下文章

python的内置异常

Python小白__网络层级

Python初级009-错误与异常

[Python公开课]零基础玩转Python进阶篇----第二节:Python的异常分析及解决

100天精通Python(数据分析篇)——第65天:Pandas聚合操作与案例

Python数据分析基础: 异常值检测和处理