中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么使用異常處理機制

發布時間:2020-08-26 16:13:07 來源:億速云 閱讀:150 作者:Leah 欄目:編程語言

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 語句來捕獲該異常,讓上層調用者來負責處理該異常。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广平县| 邻水| 灵台县| 呼和浩特市| 扎赉特旗| 从江县| 电白县| 稷山县| 平山县| 沅陵县| 宜兴市| 红河县| 阳泉市| 册亨县| 苏州市| 龙州县| 澄江县| 军事| 津南区| 怀仁县| 孟津县| 上饶市| 新乡市| 淅川县| 长宁区| 依安县| 张北县| 铜川市| 博兴县| 北票市| 莎车县| 江门市| 阿拉善左旗| 儋州市| 呼图壁县| 岳池县| 常山县| 永寿县| 乐安县| 浪卡子县| 浮山县|