




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、v1.0可編輯可修改原文鏈接事先說明哦,這不是一篇關于Python異常的全面介紹的文章,這只是在學習Python異常后的一篇筆記式的記錄和小結性質的文章。什么你還不知道什么是 異常,額.異常類Python是面向對象語言,所以程序拋出的異常也是類。常見的 Python異常有以下 幾個,大家只要大致掃一眼,有個映像,等到編程的時候,相信大家肯定會不只一次跟他們照面(除非你不用 Python 了)。python標準異常描述BaseException所有異常的基類SystemExit解釋器請求退出Keyboardinterrupt用戶中斷執行(通常是輸入AC)Exception常規錯誤的基類Stopi
2、teration迭代器沒有更多的值GeneratorExit生成器(generator)發生異常來通知退出SystemExitPython解釋器請求退出StandardError所有的內建標準異常的基類ArithmeticError所有數值計算錯誤的基類FloatingPointError浮點計算錯誤OverflowError數值運算超出最大限制ZeroDivisionError除(或取模)零(所有數據類型)AssertionError斷言語句失敗v1.0可編輯可修改AttributeError對象沒有這個屬性EOFError沒有內建輸入,到達EOF標記EnvironmentError操作系統
3、錯誤的基類lOError輸入/輸出操作失敗OSError操作系統錯誤WindowsError系統調用失敗ImportError導入模塊/對象失敗KeyboardInterrupt用戶中斷執行(通常是輸入AC)LookupError無效數據查詢的基類IndexError序列中沒有沒有此索引(index)KeyError映射中沒有這個鍵MemoryError內存溢出錯誤(對于Python解釋器不是致命的)NameError未聲明/初始化對象(沒有屬性)UnboundLocalError訪問未初始化的本地變量ReferenceError弱引用(Weak reference)試圖訪問已經垃圾回收了的對
4、象RuntimeError一般的運行時錯誤NotImplementedError尚未實現的方法SyntaxErrorPython語法錯誤IndentationError縮進錯誤TabErrorTab和空格混用SystemError一般的解釋器系統錯誤TypeError對類型無效的操作v1.0可編輯可修改ValueError傳入無效的參數UnicodeErrorUnicode相關的錯誤UnicodeDecodeErrorUnicode解碼時的錯誤UnicodeEncodeErrorUnicode編碼時錯誤UnicodeTranslateErrorUnicode轉換時錯誤Warning警告的基類D
5、eprecationWarning關于被棄用的特征的警告FutureWarning關于構造將來語義會有改變的警告OverflowWarning舊的關于自動提升為長整型(long)的警告PendingDeprecationWarning關于特性將會被廢棄的警告RuntimeWarning可疑的運行時行為(runtime behavior) 的警告SyntaxWarning可疑的語法的警告UserWarning用戶代碼生成的警告異常描述NameError嘗試訪問一個沒有申明的變量ZeroDivisionError除數為0SyntaxError語法錯誤IndexError索引超出序列范圍KeyErr
6、or請求一個不存在的字典關鍵字IOError輸入輸出錯誤(比如你要讀的文件不存在)AttributeError嘗試訪問未知的對象屬性ValueError傳給函數的參數類型不正確,比如給int()函數傳入字符串形v1.0可編輯可修改2.捕獲異常Python完整的捕獲異常的語句有點像:1. try:2. try_suite3. except Exception1,Exception2,.,Argument:4. exception_suite5. #other exceptionblock6. else:7. no_exceptions_detected_suite8. finally:9. al
7、ways_execute_suite額.是不是很復雜當然,當我們要捕獲異常的時候,并不是必須要按照上面那種格式完全寫下來,我們可以丟掉else語句,或者finally 語句;甚至不要 exception 語句,而保留finally 語句。額,暈了好吧,下面,我們就來一一說明啦。語句try_suite不消我說大家也知道,是我們需要進行捕獲異常的代碼。而 except語句是關鍵,我們try捕獲了代碼段try_suite里的異常后,將交給 except來處理。try.except語句最簡單的形式如下:1. try :2. try_suite3. except :4. exceptionblockv1
8、.0可編輯可修改上面except子句不跟任何異常和異常參數,所以無論try捕獲了任何異常,都將交給except子句的exception block 來處理。如果我們要處理特定的異常,比如說,我們只想處理除零異常,如果其他異常出現,就讓其拋出不做處理,該怎么辦呢這個時候,我們就要名n except子句傳入異常參數啦!那個ExceptionN就是我們要給 except子句的異常類(請參考異常類那個表格),表示如果捕獲到這類異常,就交給這個except子句來處理。比如:1. try :2. try_suite3. except Exception:4. exceptionblock舉個例子:1.&g
9、t;>>try :2.res2/03.exceptZeroDivisionError:4.print "Error:Divisormust not be zero!"5.6.Error:Divisormust not be zero!看,我們真的捕獲到了ZeroDivisionError 異常!那如果我想捕獲并處理多個異常怎么辦呢有兩種辦法,一種是給一個except子句傳入多個異常類參數,另外一種是寫多個except子句,每個子句都傳入你想要處理的異常類參數。甚至,這兩種用法可以混搭呢! 下面我就來舉個例子。1. try :2. floatnum = float
10、(raw_input( "Please input a float:")3. intnum = int(floatnum)4. print 100/intnumv1.0可編輯可修改5.except ZeroDivisionError:6.print "Error:you mustinputthen 1!"7.except ValueError:8.9.print "Error:you mustinput10.rootCherish tmp # python11.Please input a float:fjia12.Error:you must
11、 input a floatnum!13.rootCherish tmp # python14.Please input a float:15.Error:you must input a floatnum16.rootCherish tmp # python17.Please input a float:a float num!18. 4a float num which is large or equalwhich is large or equal then 1!上面的例子大家一看都懂,就不再解釋了。只要大家明白,我們的except可以處理一種異常,多種異常,甚至所有異常就可以了。大家可
12、能注意到了,我們還沒解釋except子句后面那個Argument是什么東西別著急,聽我一一道來。這個 Argument其實是一個異常類的實例(別告訴我你不知到什么是實 例),包含了來自異常代碼的診斷信息。也就是說,如果你捕獲了一個異常,你就可以通過 這個異常類的實例來獲取更多的關于這個異常的信息。例如:1. >>> try :2. .1/03. .exceptZeroDivisionError,reason:4. .pass1.1. .6. >>> type(reason)7. <type '' >8. >>>
13、print reason9. integer divisionor modulo by zerov1.0可編輯可修改10. >>> reason11. ZeroDivisionError( 'integer division or modulo by zero',)12. >>>13. <type '' >14. >>>15. 'Second argument to a division or modulo operation was zero.'16. >>>1
14、7. 'ZeroDivisionError'上面這個例子,我們捕獲了除零異常,但是什么都沒做。那個 reason就是異常類ZeroDivisionError 的實例,通過 type就可以看出。. except.else 語句1. >>> import2. >>> try :3.4.except5.6. .else :7.8.9.>>> ()現在我們來說說這個 else語句。Python中有很多特殊的else用法,比如用于條件 和循環。放到try語句中,其作用其實也差不多:就是當沒有檢測到異常的時候,則執行 else語句。舉個
15、例子大家可能更明白些:syslogf = open( "/root/")IOError,e:,"%s"%e),"no exception caughtn")finally子句finally子句是無論是否檢測到異常,都會執彳T的一段代碼。我們可以丟掉except子句和else子句,單獨使用try.finally ,也可以配合 except等使用。v1.0可編輯可修改1. >>>import2. >>>try :3.4.except5.例如的例子,如果出現其他異常,無法捕獲,程序異常退出,那么文件 f就
16、沒有被正常關 閉。這不是我們所希望看到的結果, 但是如果我們把語句放到 finally 語句中,無論是否有 異常,都會正常關閉這個文件,豈不是很妙syslogf = open( "/root/")IOError,e:,"%s"%e)6. . else :7. ., "noexception caughtn")8. . finally :9. >>>()大家看到了沒,我們上面那個例子竟然用到了try,except,elsefinally這四個子句!:-),是不是很有趣到現在,你就基本上已經學會了如何在Python中捕獲
17、常規異常并處理之。3.兩個特殊的處理異常的簡便方法斷言(assert )什么是斷言,先看語法:1. assert expression,reason其中assert是斷言的關鍵字。執行該語句的時候,先判斷表達式expression ,如果表達式為真,則什么都不做;如果表達式不為真,則拋出異常。 reason跟我們之前談到 的異常類的實例一樣。不懂沒關系,舉例子!最實在!v1.0可編輯可修改1. >>>assertlen( 'love')=len( 'like')2. >>>assert1=13. >>>ass
18、ert1=2,"1isnotequal2!"4. Traceback (most recent call last):5. File "<stdin>" , line 1, in <module>6. AssertionError:1 is not equal 2!我們可以看到,如果 assert后面的表達式為真,則什么都不做,如果不為真,就會拋出 AssertionErro 異常,而且我們傳進去的字符串會作為異常類的實例的具體信息存在。其實,assert異常也可以被try塊捕獲:1. >>> try :2. .
19、assert 1 = 2 ,"1 is not equal 2!"3. .exceptAssertionError,reason:4. .print"%s:%s"%1.1. .6. AssertionError:1 is not equal 2!7. >>> type(reason)8. <type '' >.上下文管理(with語句)如果你使用try,exceptfinally代碼僅僅是為了保證共享資源(如文件,數據)的唯一分配,并在任務結束后釋放它,那么你就有福了!這個 with語句可以讓你從try,ex
20、cept,finally 中解放出來!語法如下:2.1. with context_expr as var:with_suitev1.0可編輯可修改是不是不明白很正常,舉個例子來!1. >>> with open( '/root/' ) as f:2. .for line in f:3. .print line上面這幾行代碼干了什么(1)打開文件/root/(2)將文件對象賦值給f(3)將文件所有行輸出Python都會為我們關閉這個文件,我們不需要(4)無論代碼中是否出現異常, 關心這些細節。這下,是不是明白了,使用with語句來使用這些共享資源,我們不用擔心
21、會因為某種原因而沒有釋放他。但并不是所有的對象都可以使用with語句,只有支持上下文管理協議(context management protocol )的對象才可以,那哪些對象支持該協議呢如下表:file10v1.0可編輯可修改至于什么是上下文管理協議,如果你不只關心怎么用with,以及哪些對象可以使用with ,那么我們就不比太關心這個問題:)4.拋出異常(raise)如果我們想要在自己編寫的程序中主動拋出異常,該怎么辦呢raise語句可以幫助我們達到目的。其基本語法如下:1. raise SomeException , args ,traceback第一個參數,SomeException必
22、須是一個異常類,或異常類的實例第二個參數是傳遞給 SomeException的參數,必須是一個元組。這個參數用來傳遞 關于這個異常的有用信息。第三個參數traceback很少用,主要是用來提供一個跟中記錄對象( traceback )下面我們就來舉幾個例子。1.>>> raiseNameError2.Traceback(most recent call last):3.File"<stdin>" , line 1, in <module>4.NameError5.>>> raiseNameError()#異常類的實
23、例6.Traceback(most recent call last):7.File"<stdin>" , line 1, in <module>8.NameError9.>>> raiseNameError,( "There is a name error" , "in10.Traceback(most recent call last):11.File"<stdin>" , line 1, in <module>11v1.0可編輯可修改12. >>> raise NameError( "There is a name error" , "in ")#注意跟上面一個例子的區別13. Traceback (most recent call last):14. File "<stdin>" , line 1, in <module>15. NameError:('There is a name error','in')16. >>> raise
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 心理健康咨詢工作計劃與建議
- 情侶終身合同協議書圖片
- 代理保險合同協議書
- 古董古玩交易合同協議書
- 開會議酒店合同協議書
- 中國刀豆氨酸項目商業計劃書
- 智能農業監控系統創業計劃書
- 裝修公司采購合同協議書
- 社工微信公眾號的運營方案
- 三通氣動旋塞閥項目投資可行性研究分析報告(2024-2030版)
- 2025-2030全球美容機構行業消費需求與未來經營規模預測研究報告
- 浙江省金華市2025屆六年級下學期5月模擬預測數學試題含解析
- 關節科考試試題及答案
- 2025新高考地理復習十大時事熱點及命題預測(學生版+解析版)
- 診所應急知識培訓課件
- 央行MPA考核細則
- 2025-2030全球及中國自動入侵與攻擊模擬行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 大數據時代統計信息安全挑戰與應對策略研究
- 2025年攪拌車市場規模分析
- 姬石鎮衛生院三合理一規范專項實施方案
- 高處作業風險及隱患排查(安全檢查)清單
評論
0/150
提交評論