baseexception
+-- systemexit
+-- keyboardinterrupt
+-- generatorexit
+-- exception
+-- stopiteration
+-- standarderror
| +-- buffererror
| +-- arithmeticerror
| | +-- floatingpointerror
| | +-- overflowerror
| | +-- zerodivisionerror
| +-- assertionerror
| +-- attributeerror
| +-- environmenterror
| | +-- ioerror
| | +-- oserror
| | +-- windowserror (windows)
| | +-- vmserror (vms)
| +-- eoferror
| +-- importerror
| +-- lookuperror
| | +-- indexerror
| | +-- keyerror
| +-- memoryerror
| +-- nameerror
| | +-- unboundlocalerror
| +-- referenceerror
| +-- runtimeerror
| | +-- notimplementederror
| +-- syntaxerror
| | +-- indentationerror
| | +-- taberror
| +-- systemerror
| +-- typeerror
| +-- valueerror
| +-- unicodeerror
| +-- unicodedecodeerror
| +-- unicodeencodeerror
| +-- unicodetranslateerror
+-- warning
+-- deprecationwarning
+-- pendingdeprecationwarning
+-- runtimewarning
+-- syntaxwarning
+-- userwarning
+-- futurewarning
+-- importwarning
+-- unicodewarning
+-- byteswarning
try
捕獲由python或程式本身引發的異常
raise
手工地引發乙個異常
為什麼要使用異常
錯誤處理,當python檢查以程式執行時的錯誤就引發異常,你可以在程式裡捕捉和處理這些錯誤,或者忽略它們。
事件通知,異常也可以作為某種條件的訊號,而不需要在程式裡傳送結果標誌或顯式地測試它們。
特殊情形處理,有時有些情況是很少發生的,把相應的處理**改為異常處理會更好一些。
奇特的控制流,異常是乙個高層次的"goto",可以把它作為實現奇特的控制流的基礎。如反向跟蹤等。
異常的基礎知識
python的try語句有兩種風格---一種是處理異常(try/except/else),一種是無論是否發生異常都將執行最後的**(try/finally)。
try/except/else風格
try:
《語句》 #執行別的**
except 《名字》:
《語句》 #如果在try部份引發了'name'異常
except 《名字》,《資料》:
《語句》 #如果引發了'name'異常,獲得附加的資料
else:
《語句》 #如果沒有異常發生
try的工作原理是,當開始乙個try語句後,python就在當前程式的上下文中作標記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
如果當try後的語句執行時發生異常,python就跳回到try並執行第乙個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句裡發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程式的最上層(這樣將結束程式,並列印預設的出錯資訊)。
如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
try/finally風格
try:
《語句》
finally:
《語句》 #退出try時總會執行
raise
python總會執行finally子句,無論try子句執行時是否發一異常。
當你想無論是否發生異常都確保執行某些**時,try/finally是有用的。
要引發異常,你需要寫raise語句,它的形式很簡單,raise後面跟著要引發的異常。
raise #手工地引發異常
raise ,#傳遞乙個附加的資料
什麼是異常名(name)呢?它也許是內建作用域內的內建異常(如indexerror),或者是你程式中的任意字串物件。
預設行為:顯示錯誤資訊。
$ python test.py
traceback (innermost last):
file "test.py", line 3, in ?
a = 1 /0
zerodivisionerror: integer division or modulo
當乙個未捕獲的異常發生時,python將結束程式並列印乙個堆疊跟蹤資訊,以及異常名和附加資訊。
用try捕獲內建異常
如果你不想在異常發生時結束你的程式,只需在try裡捕獲它。
#!/usr/bin/python
try:
a = 1 /0
print a
except:
print 'i get the error'
當程式執行是會捕獲乙個錯誤並執行except後面的**。
異常並不總是壞事情,例如,檔案物件的read方法在檔案尾時返回乙個空串,python也提供乙個內建函式raw_input,它從標準輸入流讀入。與read方法不同,當遇到檔案尾時,raw_input()引發內建的eoferror錯誤。所以可以這樣用:
while 1:
try:
line = raw_input() #從stdin讀入行
except eoferror:
break #在檔案末尾退出迴圈
esle:
# 其它處理**
用異常傳遞成功的訊號
found = 'item found'
def search():
引發或返回found
try:
search()
except found:
successful
else:
fail
可以使用try來除錯**,你可以用自已的異常處理替換python預設的異常處理。把整個程式封裝在乙個外部try裡面,你可以捕獲執行時的任何異常。
try語句子句形式表
except: 捕獲所有異常
except name: 只捕獲特定的異常
except name,value: 捕獲異常和它的附加資料
except (name1,name2): 捕獲任何列出的異常
else: 如果沒有異常
finally: 總是執行
捕獲多個異常中的乙個,python從上到下地檢視except子句,括號裡列出多個異常與列出單獨的異常是一樣的,只是更簡潔一些。
執行時巢狀的異常,python會匹配最近的except。
finally子句無論如何都會執行,所以它是做清除動作的好地方,如關閉乙個檔案的操作。
捕捉所有異常
try:
# 你的**
except baseexception, e:
print(str(e))
Python 異常 學習筆記
python 標準異常總結 try 和 try finally 語句 try 下面是檢測範圍,如發生異常停止在第乙個異常的位置 fh open testfile w fh.write 這是乙個測試檔案,用於測試異常 except oserror as reason 下面是出現異常後輸出的 print...
Python學習筆記 異常
1 異常概念 程式在執行是,如果python直譯器遇到乙個錯誤,會停止程式的執行,並且提示一些錯誤資訊,這就是異常 程式停止執行並且提示錯誤資訊這個動作,我們稱之為 丟擲 raise 異常 程式開發是,很難將所有的特殊情況都處理的面面俱到,通過一異常捕獲可以針對突發事件做集中的處理,從而保證程式的穩...
Python學習筆記 異常
python的執行時錯誤稱為異常 1.語法錯誤 軟體的結構上有錯誤而導致不能被直譯器解釋或不能被編譯器編譯。2.邏輯錯誤 由於不完整或不合法的輸入所致,也可能是邏輯無法生存 計算或者輸出結果需要的過程無法執行等。python異常是乙個物件,表示錯誤或意外情況 在python檢測到乙個錯誤時,將觸發乙...