若是你在寫python程序時遇到異常後想進行以下處理的話,通常用try來處理異常,假設有下面的一段程序:java
try: 語句1 語句2 . . 語句N except .........: do something .......
可是你並不知道"語句1至語句N"在執行會出什麼樣的異常,但你還要作異常處理,且想把出現的異常打印出來,並不中止程序的運行,因此在"except ......"這句應怎樣來寫呢?python
總結了一下3個方法:函數
方法一:捕獲全部異常fetch
try: a=b b=c except Exception,e: print Exception,":",e
方法二:採用traceback模塊查看異常日誌
#引入python中的traceback模塊,跟蹤錯誤 import traceback try: a=b b=c except: traceback.print_exc()
發生異常時,Python能「記住」引起的異常以及程序的當前狀態。Python還維護着traceback(跟蹤)對象,其中含有異常發生時與函數調用堆棧有關的信息。記住,異常可能在一系列嵌套較深的函數調用中引起。程序調用每一個函數時,Python會在「函數調用堆棧」的起始處插入函數名。一旦異常被引起,Python會搜索一個相應的異常處理程序。若是當前函數中沒有異常處理程序,當前函數會終止執行,Python會搜索當前函數的調用函數,並以此類推,直到發現匹配的異常處理程序,或者Python抵達主程序爲止。這一查找合適的異常處理程序的過程就稱爲「堆棧展轉開解」(Stack Unwinding)。解釋器一方面維護着與放置堆棧中的函數有關的信息,另外一方面也維護着與已從堆棧中「展轉開解」的函數有關的信息。code
方法三:採用sys模塊回溯最後的異常對象
#引入sys模塊 import sys try: a=b b=c except: info=sys.exc_info() print info[0],":",info[1]
sys.exc_info()的返回值是一個tuple, (type, value/message, traceback)io
這裏的type ---- 異常的類型import
value/message ---- 異常的信息或者參數file
traceback ---- 包含調用棧信息的對象。
從這點上能夠看出此方法涵蓋了traceback.
可是,若是你還想把這些異常保存到一個日誌文件中,來分析這些異常,那麼請看下面的方法:
把 traceback.print_exc() 打印在屏幕上的信息保存到一個文本文件中
import traceback try: a=b b=c except: f=open("c:log.txt",'a') traceback.print_exc(file=f) f.flush() f.close()
不管try是否發生異常,finally總會執行
def catcher(): try: ... finally: print 'after fecth'
finally執行的順序和java中的同樣。
try無異常,纔會執行else
def catcher(): try: ... except: print "got exception" else: print "not exception"
利用raise傳遞異常
def catcher(): try: ... except: print "got exception" raise
raise語句不包括異常名稱或額外資料時,會從新引起當前異常。若是但願捕獲處理一個異常,而又不但願異常在程序代碼中消失,能夠經過raise從新引起該異常。
except(name1, name2)
def catcher(): try: fetcher(x, 4) except(TypeError, IndexError): print "got exception" else: print "not exception"
捕獲列表列出的異常,進行處理。若except後無任何參數,則捕獲全部異常。