如果你在寫python程序時遇到異常後想進行如下處理的話,一般用try來處理異常,假設有下面的一段程序:
try : 語句 1 語句 2 . . 語句N except .........: do something ....... |
說明:
1.Python用異常對象(exception object)表示異常情況,遇到錯誤後,會引發異常。如果異常對象並未被處理或捕捉,程序就會用所謂的回溯(Traceback,一種錯誤信息)終止執行。
2.try.....except捕捉異常,如果不拋出,則直接繼續往下處理,raise 拋出異常,拋給上一層級處理
3.關於回溯(Traceback):就是將異常交給上一層使用者處理
4.raise相當於C#中的throw,用於拋出異常
1)add中有異常,無法處理,直接拋給main,main無法處理,交給os處理,os一般有異常時,直接終止程序,所以print('我被執行了')未被執行
def add(): a = b + c if __name__ = = '__main__' : add() print ( '我被執行了' ) |
def add(): try : a = b + c except Exception as e: print (e) if __name__ = = '__main__' : add() print ( '我被執行了' ) |
3.add 中拋出異常,但是main中沒有進程處理,異常交給os處理,
def add(): try : a = b + c except Exception as e: print (e) raise if __name__ = = '__main__' : add() print ( '我被執行了' ) |
總結了一下3個方法:但是你並不知道"語句1至語句N"在執行會出什麼樣的異常,但你還要做異常處理,且想把出現的異常打印出來,並不停止程序的運行,所以在"except ......"這句應怎樣來寫呢?
方法一:捕獲所有異常
try : a = b b = c except Exception as e: print (Exception, ":" ,e) |
方法二:採用traceback模塊查看異常
#引入python中的traceback模塊,跟蹤錯誤 import traceback try : a = b b = c except : traceback.print_exc() |
方法三:採用sys模塊回溯最後的異常
#引入sys模塊 import sys try : a = b b = c except : info = sys.exc_info() print (info[ 0 ], ":" ,info[ 1 ]) |
try except 語句還有一個可選的else子句,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行。例如:
for arg in sys.argv[ 1 :]: try : f = open (arg, 'r' ) except IOError: print ( 'cannot open' , arg) else : print (arg, 'has' , len (f.readlines()), 'lines' ) f.close() |
finally子句
finally子句和try子句聯合使用但是和except語句不同,finally不管try子句內部是否有異常發生,都會執行finally子句內的代碼。所有一般情況下,finally自己常常用於關閉文件或者在Socket中。
try : print 2 / '0' except (ZeroDivisionError,Exception): print '發生了一個異常' finally : print '不管是否發生異常都執行' |
raise
Python 使用 raise 語句拋出一個指定的異常。例如:
raise NameError( 'HiThere' ) |
raise 唯一的一個參數指定了要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。
如果你只想知道這是否拋出了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就可以再次把它拋出。
try : raise NameError( 'HiThere' ) except NameError: print ( 'An exception flew by!' ) raise |