1異常
異常就是非正常狀態,在Python中使用異常對象來表示異常。若程序在編譯或運行過程中發生錯誤,程序的執行過程就會發生改變,拋出異常對象,程序流進入異常處理。如果異常對象沒有被處理或捕捉,程序就會執行回溯(Traceback)來終止程序。
2異常類型
通用異常類型表
Exception類:是通用異常基類下列異常類均繼承于Exception類,python解析器會自動將通用異常類型名稱放在內建命名空間中,所以當使用通用異常類型時,不需要import exceptions模塊。
3異常處理
3.1 觸發異常raiseraise關鍵字:手動拋出一個通用的異常類型(Exception),類似Java中的throw語句。raise關鍵字后跟異常的名稱,異常名稱能夠標識出異常類的對象。執行raise語句時,python會創建指定異常類的對象,還能夠指定對異常對象進行初始化的參數,參數也可以為由若干參數組成的元組。注意:一旦執行raise語句,程序就會被終止。格式:raise [exceptionType[,argument][,traceback]]
traceback:這個參數用于追蹤異常對象,一般很少使用。這樣就可以觸發一個異常,并且接收異常信息。3.2 傳遞異常當你捕獲到異常之后又希望再次的觸發異常只需要使用不帶任何參數的raise關鍵字。
異常會在捕獲之后再次觸發同一個異常。3.3 assert語句觸發異常assert語句根據后面的表達式的真假來控制程序流。若為True,則往下執行。若為False,則中斷程序并調用默認的異常處理器,同時輸出指定的提示信息。
例如:
執行結果:
3.4 捕獲異常try..except..else注意:except子句的數量沒有限制,但使用多個except子句捕獲異常時,如果異常類之間具有繼承關系,則子類應該寫在前面,否則父類將會直接截獲子類異常。放在后面的子類異常也就不會執行。格式:
4try的工作原理
執行一個try語句時,python解析器會在當前程序流的上下文中作標記,當出現異常后,程序流能夠根據上下文的標記回到標記位,從而避免終止程序。1. 如果try語句執行時發生異常,程序流跳回標記位,并向下匹配執行第一個與該異常匹配的except子句,異常處理完后,程序流就通過整個try語句(除非在處理異常時又引發新的異常)。2. 如果沒有找到與異常匹配的except子句(也可以不指定異常類型或指定同樣異常類型Exception,來捕獲所有異常),異常被遞交到上層的try(若有try嵌套時),甚至會逐層向上提交異常給程序(逐層上升直到能找到匹配的except子句。實在沒有找到時,將結束程序,并打印缺省的錯誤信息)。3. 如果在try子句執行時沒有發生異常,python將執行else語句后的語句(可選),然后控制流通過整個try語句。
執行結果:
嵌套try:
執行結果:
5捕捉多個異常
方法一:指定一個通用異常,可以捕獲多個不同的包含在Exception類中的異常類。
方法二:在一個except子句后將多個異常作為元組元素列出。
方法三:except子句后不帶任何異常名稱,捕獲所有異常
6try..finally語句
無論try語句塊中是否觸發異常,都會執行finally子句中的語句塊,因此一般用于關閉文件或關閉因系統錯誤而無法正常釋放的資源。比如文件關閉,釋放鎖,把數據庫連接返還給連接池等。
注意:try..finally與try..except 是可以同時使用的。
NOTE:try…finally 的意義在于,就是我們在 try 代碼塊中執行了 return 語句,但是仍然會繼續執行在 finally 中的代碼塊,所以我們一般用作處理資源的釋放。
7自定義異常
通過(直接或簡介)繼承Exception類來創建一個自定義異常類,自定義的異常類只能通過raise關鍵字來手動觸發。
執行結果:
with..as觸發異常自動關閉資源在使用類文件的流對象時,都需要單獨的調用close()來關閉資源。with..as語句能夠實現在with語句塊執行完后,自動的關閉文件。如果with語句塊中觸發異常,會調用默認的異常處理器處理,而且文件仍然能夠正常關閉。
執行結果:
8as獲取異常信息
每個異常都會有一定的描述信息,可以通過as關鍵字來獲取。但是這種異常信息并不適合一般用戶閱讀,所以會使用自定義的異常信息。但是仍然會將原有的異常信息保留起來,用于后期的異常分析。
執行結果:
異常參數
也可以使用異常參數作為輸出的異常信息參數,來獲取異常信息。并且異常參數中包含有異常信息、錯誤數字、錯誤位置等屬性。
執行結果:
9traceback追蹤異常
使用traceback追蹤異常的時候,需要import traceback模塊。traceback模塊可以有效的幫助查看異常的詳細信息。注意:若希望獲取異常的詳細信息,卻又不會終止程序的執行,可以在except子句中使用
輸出sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file等異常信息,實際上是以線程安全的方式去使用sys.exc_info()函數來獲取相同的信息。
執行結果:
異常信息的重定向:如果希望將異常的信息保存在一個指定的文件中,以供后期分析。可以使用下面的方法:
執行結果:
sys.exc_info()獲取異常信息
traceback.print_exc()函數實際上是call sys.exc_info()
執行結果:
異常處理用于處理程序錯誤之外,還有許多應用的地方。如關閉資源、平臺兼容、模塊導入等。
-
處理器
+關注
關注
68文章
19404瀏覽量
230813 -
自動化
+關注
關注
29文章
5620瀏覽量
79535 -
python
+關注
關注
56文章
4807瀏覽量
84961
原文標題:只需9個步驟,完美實現自動化運維異常處理!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論