python中try except處理程序異常的三種經常使用方法

若是你在寫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後無任何參數,則捕獲全部異常。

相關文章
相關標籤/搜索