每次版本結束都描述這著同樣的錯誤,相似的問題,但始終沒見解決。所以今天,我就來總結下Python的錯誤與異常!
異常與錯誤
錯誤
-
語法錯誤
可以通過IDE或者解釋器給出提示的錯誤
opentxt('a.jpg','r')
-
邏輯錯誤
語法層面沒有問題,但是自己代碼的邏輯有問題
if age>18: print('未成年')
異常
多指在程序執行過程中,出現的未知錯誤,語法和邏輯本身是正確的。可以通過代碼進行處理或修復
異常分類
-
除零異常(ZeroDivisionError):
1/0
-
名稱異常(NameError):
if age>5,age未定義
-
類型異常(TypeError):
? ? ?1+'abc'
-
索引異常(IndexError):
a=[1,2,3] a[4]
-
鍵異常(KeyError):
a={'a':1,'b':2} a['c']
-
值異常(ValueError)
int('abcd')
-
屬性異常(AttributeError)
name='Dracular' print(name.age)
-
迭代器異常(StopIteration)
a=iter([1,2]) print(next(a)) print(next(a)) print(next(a))
-
系統異常類繼承樹(BaseException所有內建的異常基類)
-
SystemExit
由sys.exit(0函數引發,當他不處理時,python解釋器退出)
-
KeyboardInterrupt
當用戶中斷操作引發(ctrl +c)
-
GeneratorExit
當調用一種generator的close()方法引發
-
Exception
所有內置的、非系統退出異常是從該類派生的,因為該類派生所有用戶定義的異常
-
異常處理格式
多種異常捕獲
剛才介紹了很多異常的分類,也看到了異常處理的格式,那么針對多種異常如何更簡潔的捕獲呢?
-
將多個異常通過元組歸類到一起
except (ZeroDivisionError,NameError) as error:
-
使用Exception這個基類全部捕獲
except Exception as errorinfo:
使用with處理異常
用于執行一段代碼前,進行預處理,執行完成這段代碼后,進行清理操作
with content_expression[as target(s)]: withbody
大家用到最多的莫過于在讀寫文件時,使用with open
?
為什么說他是一個上下文處理器呢?
首先咱們在文件讀寫的時候主要分三個步驟:
-
打開文件
-
操作文件的內容
-
關閉文件
正常情況下,我們使用的方式為:
?
那么如果我們在操作文件的時候,出現了異常導致系統退出,就無法正常的關閉文件
但使用with的上下文管理器,就可以達到異常退出時的清理操作!
可是沒有論證,空口在這里吹逼不太好啊,舉個例子來驗證with自帶的異常清理。
先看下這段代碼:
我們在寫文件的時候,手動觸發一個異常,然后在except捕獲異常后,去重命名該文件。
然后由于沒有正常的關閉,此時你去重命名會給出文件正在占用的提示
那同樣的方式,我們使用with操作看看效果:
此時正常執行完成,程序沒有拋出異常,為什么?因為在上下文處理器中,with捕獲異常后,自動的執行了文件的關閉操作,溜不溜?
上下文管理器原理
所謂上下文管理器的原理,其實就是以下三點
-
調用enter?方法,進行預處理操作
-
執行用戶操作
-
調用exit方法,完成清理操作
知道了原理,讓我們通過自己編寫的上下文管理器,重構一下open的方法,讓它裝逼即耀眼又安全吧
完美結束….
了解下剛才的
__exit__
剛才看到在定義
__exit__
方法時,自帶了三個參數exc
type, exc
val, exc_tb
這是什么呢?分別為:異常類別,異常值,追蹤信息,怎么看他的值呢?
把上面代碼中
raise ValueError
改為
1/0
在`__exit
`方法中加入print(exc_type, exc_val, exc_tb)
得到如下結果:
大家會問到追蹤信息是什么呢?其實大家天天見….當你代碼錯誤了,提示哪一行有問題的時候,這個幫你定位的東西,就是追蹤信息。
想看到追蹤信息需要引入一個模塊,traceback
繼續在
__exit__
中添加這兩行信息
import traceback
print(traceback.extract_tb(exc_tb))
output:
[('E:/Python/xxxx/b.py', 21, '
', 'raise ValueError')]
上面個list什么意思呢?錯誤的文件,錯誤的行號,文件類型,錯誤的語句
是不是吊炸天?好了今天就學到這里,碎覺…..
The End
OK,今天的內容就到這里,如果覺得內容對你有所幫助,歡迎點擊文章右下角的“
在看
”。
期待你關注我的公眾號
清風Python
,如果覺得不錯,希望能動動手指轉發給你身邊的朋友們。
作者:清風Python
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
