程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python基礎異常處理梳理總結

編輯:Python

目錄

前言

一、常見的Python異常

AssertionError:斷言語句(assert)失敗

AttributeError:嘗試訪問未知的對象屬性

IndexError:索引超出序列的范圍

KeyError:字典查找一個不存在的關鍵字

NameError:嘗試訪問一個不存在的變量

OSError:操作系統產生的異常

SyntaxError:Python的語法錯誤

TypeError:不同類型間的無效操作

ZeroDivisionError:除數為零

二、try-except語句

三、對多個異常統一處理

四、捕獲所有異常

五、try-finally語句

六、raise語句

七、豐富的else語句

八、簡潔的with語句

前言

我們是人,也會經常犯錯,程序員也不例外,就算是經驗豐富的碼農,也不能保證寫的代碼百分之百沒有任何問題。另外,作為一個合格的程序員,在編程時要意識到一點,那就是永遠不要相信你的用戶,所以要多方面考慮,這樣寫出來的程序才會更加安全穩定。

那麼既然程序總會出問題,那我們就需要用適當的方法去解決問題。程序出現邏輯錯誤或者用戶輸入不合法都會引發異常,但這些異常並不是致命的,不會導致程序崩潰,可以利用Python提供的異常處理機制,在異常出現的時候及時捕獲,並從內部自我消化掉。

那麼什麼是異常呢?舉個例子:

這裡當然假設用戶的輸入是正確的,但是只要用戶輸入一個不存在的文件名,那麼上面的代碼是不堪一擊的:

上面的例子就拋出了一個FileNotFoundError異常,那麼Python還可能拋出哪些異常呢,在下面給大家介紹一下常見的異常,這樣以後遇到這樣的異常時就不會感到陌生了。

一、常見的Python異常AssertionError斷言語句(assert)失敗

在以前的分支和循環章節中講過斷言語句(assert),當assert這個關鍵字後邊的條件為假的時候,程序將終止並拋出AssertionError異常。assert語句一般是在測試程序的時候用於在代碼中置入檢查點:

AttributeError:嘗試訪問未知的對象屬性

當試圖訪問的對象屬性不存在時拋出的異常:

IndexError:索引超出序列的范圍

在使用序列的時候就常常會遇到IndexError異常,原因是索引超出序列范圍的內容

KeyError:字典查找一個不存在的關鍵字

試圖在字典中查找一個不存在的關鍵字時就會引發KeyError異常,因此建議使用dict.get()方法

NameError:嘗試訪問一個不存在的變量

嘗試訪問一個不存在的變量時,Python會拋出NameError異常:

OSError:操作系統產生的異常

OSError顧名思義就是操作系統產生的異常,像打開一個不存在的文件會引發FileNotFoundError,而這個FileNotFoundError就是OSError的子類。上面的例子已經演示過,這裡就不再贅述了。

SyntaxError:Python的語法錯誤

如果遇到SyntaxError是Python的語法錯誤,這時Python的代碼並不能繼續執行,你應該找到並改正錯誤:

TypeError:不同類型間的無效操作

有些類型不同是不能相互進行計算的,否則會拋出TypeError異常:

ZeroDivisionError:除數為零

我們都知道除數不能為零,所以除以零就會引發ZeroDivisionError異常:

二、try-except語句

try-except語句格式如下:

try:
檢測范圍
except Exception[as reason]:
出現異常(Exception)後的處理代碼

try-except語句用於檢測和處理異常,舉個例子來說明這一切是如何工作的。

前面我們也介紹過,當要打開的文件不存在時,就會引發FileNotFoundError,顯然用戶的體驗不好,因此我們可以這樣修改:

其執行結果是:

上面的例子由於使用了大家習慣的語言來描述錯誤信息,用戶體驗會好很多。

但是從程序員的角度來看,導致OSError異常的原因有很多(例如FileNotFoundError、FileExistsError、PermissionError等),所以可能會更在意錯誤的具體內容,這裡可以使用as把具體的錯誤消息打印出來

其執行結果為:

針對不同異常設置多個except

一個try語句可以和多個except語句搭配,分別對感興趣的異常進行檢測處理:

三、對多個異常統一處理

except後面還可以跟多個異常,然後對這些異常進行統一的處理:

四、捕獲所有異常

如果你無法確定要對哪一類異常進行處理,只是希望在try語句塊裡一旦出現任何異常,可以給用戶一個“看得懂”的提醒,那麼可以這麼做:

五、try-finally語句

看下面這個例子,如果"a.txt"確實存在,open()函數可以正常返回文件對象,但異常卻發生在打開文件後的sum = 1 + ‘1’語句上,此時Python將直接跳到except語句,也就是說,文件打開了,但並沒有執行關閉文件的命令:

為了實現這種“就算出現異常,但也不得不執行的收尾工作(比如在程序崩潰前保存用戶文檔)”,引入了finally來擴展try:

如果try語句塊中沒有出現任何運行時錯誤,會跳過except語句執行finally語句塊的內容。
如果出現異常,則會先執行except語句塊的內容再執行finally語句塊的內容。
總之,finally語句塊中的內容就是確保無論如何都將被執行的內容。

六、raise語句

有些讀者可能會思考,我的代碼能不能自己拋出一個異常呢?答案是可以的,你可以使用raise語句拋出一個異常

拋出的異常還可以帶參數,表示異常的解釋

七、豐富的else語句

對於絕大多數編程語言來說,else語句都只能跟if語句搭配,但是在Python裡,else語句的功能更加豐富。在Python中,else語句不僅能跟if語句搭,跟循環語句(for語句或while語句)搭配,還能跟剛才所講的異常處理進行搭配

1、典型的if-else語句

if 條件:
條件為真執行
else:
條件為假執行

2、else與for和while循環語句搭配

舉個例子:

這段程序主要是求用戶輸入的數的最大約數,如果是素數的話會提醒這是一個素數。
使用暴力的方法一個個嘗試(num%count==0),如果符合條件則打印出最大的約數,並break,同時不會執行else語句塊的內容了。但如果一直沒有遇到合適的條件,則會執行else語句塊內容。

for語句的用法和while語句一樣,這裡便不再贅述了。

3、else語句與異常處理進行搭配

else語句還能和剛剛講的異常處理進行搭配,只要try語句塊裡沒有出現任何異常,那麼就會執行else語句塊裡的內容

舉個例子:

八、簡潔的with語句

有些讀者覺得打開文件又要關閉文件,還要關注異常處理有點麻煩,所以Python提供了一個with語句,利用這個語句抽象出文件操作中頻繁使用的try/except/finally相關的細節,對文件操作使用with語句,將大大減少代碼量。

舉個例子:

使用with語句,可以改成這樣:

有了with語句,就再也不用擔心忘記關閉文件了。

到此這篇關於Python基礎異常處理梳理總結的文章就介紹到這了,更多相關Python異常處理內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved