1. 程式人生 > >Python——異常層級分析

Python——異常層級分析

ali com alt too 直接 數值 意義 roc brush

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——異常層級分析