python_異常處理_try....except

 

如果你在寫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=
except
    traceback.print_exc()

 

方法三:採用sys模塊回溯最後的異常

#引入sys模塊
import sys 
try
    a=
    b=
except
    info=sys.exc_info() 
    print (info[0],":",info[1])

 

try except 語句還有一個可選的else子句,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行。例如:

for arg in sys.argv[1:]:
    try:
        = 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章