您好,登錄后才能下訂單哦!
Python怎么使用異常處理機制?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成功的異常處理應該實現如下 4個目標:
使程序代碼混亂最小化。
捕獲并保留診斷信息。
通知合適的人員。
采用合適的方式結束異常活動。
下面介紹達到這些效果的基本準則。
不要過度使用異常
不可否認,Python 的異常機制確實方便,但濫用異常機制也會帶來一些負面影響。過度使用異常主要表現在兩個方面:
把異常和普通錯誤混淆在一起,不再編寫任何錯誤處理代碼,而是以簡單地引發異常來代苦所有的錯誤處理。
使用異常處理來代替流程控制。
熟悉了異常使用方法后,程序員可能不再愿意編寫煩瑣的錯誤處理代碼,而是簡單地引發異常。實際上這樣做是不對的,對于完全己知的錯誤和普通的錯誤,應該編寫處理這種錯誤的代碼,增加程序的健壯性。只有對于外部的、不能確定和預知的運行時錯誤才使用異常。
對比前面五子棋游戲中,處理用戶輸入坐標點己有棋子的兩種方式。如果用戶試圖下棋的坐標點己有棋子:
#如果要下棋的點不為空 if board[int(y_str) - 1) [int(x_str) - 1] !="╋" : inputStr = input ("您輸入的坐標點己有棋子了,請重新輸入\n") continue
上面這種處理方式檢測到用戶試圖下棋的坐標點己經有棋子,立即打印一條提示語句,并重新開始下一次循環。這種處理方式簡潔明了、邏輯清晰,程序的運行效率也很好程序進入 if 塊后,即結束了本次循環。
如果將上面的處理機制改為如下方式:
#如果要下棋的點不為空 if board[int(y_str) - 1) [int(x_str) - 1) != "╋": #引發默認的RuntimeError 異常 raise
上面這種處理方式沒有提供有效的錯誤處理代碼,當程序檢測到用戶試圖下棋的坐標點己經有棋子時,并沒有提供相應的處理,而是簡單地引發一個異常。這種處理方式雖然簡單,但 Python 解釋器接收到這個異常后,還需要進入相應的 except 塊來捕獲該異常,所以運行效率要差一些。而且用戶下棋重復這個錯誤完全是可預料的,所以程序完全可以針對該錯誤提供相應的處理,而不是引發異常。
另外,異常機制的效率比正常的流程控制效率差,所以不要使用異常處理來代替正常的程序流程控制。例如,對于如下代碼:
#定義一個字符串列表 my_list =["Hello", "Python", "Spring"] #使用異常處理來遍歷arr數組的每個元素 try: i = 0 while True: print (my_list [i]) i += 1 except: pass
運行上面程序確實可以實現遍歷 my_list 列表的功能,但這種寫法可讀性較差,而且運行效率也不高。程序完全有能力避免產生 indexError 異常,程序“故意”制造這種異常,然后使用 except 塊去捕獲該異常,這是不應該的。將程序改為如下形式肯定要好得多:
i = 0 while i < len(my_list): print(my_list[i]) i += 1
注意,異常只應該用于處理非正常的情況,不要使用異常處理來代替正常的流程控制。對于一些完全可預知,而且處理方式清楚的錯誤,程序應該提供相應的錯誤處理代碼,而不是將其籠統地稱為異常。
不要使用過于龐大的 try 塊
很多初學異常機制的讀者喜歡在 try 塊里放置大量的代碼,這看上去很“簡單”,但這種“簡單”只是一種假象,只是在編寫程序時看上去比較簡單。但因為 try 塊里的代碼過于龐大,業務過于復雜,就會造成 try 塊中出現異常的可能性大大增加,從而導致分析異常原因的難度也大大增加。
而且當時塊過于龐大時,就難免在 try 塊后緊跟大量的 except 塊才可以針對不同的異常提供不同的處理邏輯。在同一個 try 塊后緊跟大量的 except 塊則需要分析它們之間的邏輯關系,反而增加了編程復雜度。
正確的做法是,把大塊的 try 塊分割成多個可能出現異常的程序段落,并把它們放在單獨的 try 塊中,從而分別捕獲并處理異常。
不要忽略捕獲到的異常
不要忽略異常!既然己捕獲到異常,那么 except 塊理應做些有用的事情,及處理并修復異常。except 塊整個為空,或者僅僅打印簡單的異常信息都是不妥的!
except 塊為空就是假裝不知道甚至瞞天過海,這是最可怕的事情,程序出了錯誤,所有人都看不到任何異常,但整個應用可能已經徹底壞了。僅在 except 塊里打印異常傳播信息稍微好一點,但僅僅比空白多了幾行異常信息。通常建議對異常采取適當措施,比如:
處理異常。對異常進行合適的修復,然后繞過異常發生的地方繼續運行;或者用別的數據進行計算,以代替期望的方法返回值;或者提示用戶重新操作……總之,程序應該盡量修復異常,使程序能恢復運行。
重新引發新異常。把在當前運行環境下能做的事情盡量做完,然后進行異常轉譯,把異常包裝成當前層的異常,重新傳給上層調用者。
在合適的層處理異常。如果當前層不清楚如何處理異常,就不要在當前層使用 except 語句來捕獲該異常,讓上層調用者來負責處理該異常。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。