您好,登錄后才能下訂單哦!
什么是異常?
異常是Python對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。在程序運行過程中,總會遇到各種各樣的錯誤,有的錯誤是程序編寫有問題造成的
還有一類錯誤是完全無法在程序運行過程中預測的:一切異常皆是對象
系統定義的異常:
也可以自定義異常,創建類,
異常處理的作用是:
1:不想讓程序終止
2:如果出錯了,需要特殊處理
異常處理的語法是:try/except語句,有的后面也會加else
try: a = 2 b = 0 print a / b except: print '出錯啦!!!' print 1111
try ....except...else 語句,當沒有異常發生時,else中的語句將會被執行。
a=10 b=1 try: c = b/ a print c except (IOError ,ZeroDivisionError),x: print x else: print "no error" print "done"
使用except而不帶任何異常類型: except,后面不寫,表示捕獲所有異常
try: 正常的操作 ...................... except: 發生異常,執行這塊代碼 ...................... else: 如果沒有異常執行這塊代碼
使用except而帶多種異常類型: except,后面寫,捕獲對應的異常,
except:
0.不寫異常代表捕獲一些類型的錯誤
1.可以一次捕捉多個異常 (exception1, exception2)
2.多個except:
不要求從小到大捕捉
3.可以在except語句塊后面加一個else,當沒有錯誤發生時,會自動執行else語句
4.e代表當前異常的實例 print可以顯示錯誤信息 , e or as e
5.如果想要輸出詳細堆棧信息,使用import traceback traceback.print_exc()
舉例說明5:雖然錯誤堆棧信息打印出來了,但是程序還是在繼續執行的
import traceback try: print 5/0 except (TypeError,ZeroDivisionError) as e: traceback.print_exc() print e.message else: print 3 print 2
運行結果:
如果想打印異常的信息,可以 設置as 別名,然后通過別名.message,來捕獲異常信息,如下例子所示
try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 發生以上多個異常中的一個,執行這塊代碼 ...................... else: 如果沒有異常執行這塊代碼
except ZeroDivisionError: ##捕獲被除數不能等于0的異常 except BaseException:##也可以直接寫這個所有異常的基類
try: a = 2 b = 0 print a / b except ZeroDivisionError as e : print e.message #捕獲異常信息 print '出錯啦!!!' print 1111
執行結果:
integer division or modulo by zero
出錯啦!!!
1111
try except的兩個作用:
try-finally 語句:try-finally 語句無論是否發生異常都將執行最后的代碼。
try: <語句> finally: <語句> #退出try時總會執行 raise
finally: # 不管try except是否出錯,都會打印出finally文件里面的東西,可以看下如下例子:
1:如果try里面東西沒有執行成功,try里面的print也不會打印的,
2:finally里面的東西不管try except是否出錯,都會打印
def jianfa(a,b): if a<b: raise BaseException('被減數不能小于減數') #return 0 else: return a-b try: print jianfa(0, 3) print 'huice' #不打印 except: pass finally: print 111
拋出異常
拋出解釋:如果錯誤沒有被捕獲,它就會一直往上拋,最后被Python解釋器捕獲,打印一個錯誤信息,然后程序退出:語法:raise 異常類名 (錯誤信息)
練習題:#1.編寫一個計算減法的方法,當第一個數小于第二個數時,拋出“被減數不能小于減數"的異常
def jianfa(a,b): if a<b: raise BaseException('被減數不能小于減數') #return 0 else: return a-b print jianfa(1, 3)
執行結果如下:
練習題:
1.從開發的代碼庫中得到一組數據,表示每個文件的代碼變更情況
{'login.py': 'a 8 d 2 u 3', 'order.py': 'a 15 d 0 u 34', 'info.py': 'a 1 d 20 u 5'}
其中 a表示新增行數,d表示刪除行數,u表示修改行數。login.py的變更行數為13
要求:統計出每個文件的變更行數
第一種方法:通過if語句,判斷
data={'login.py': 'a 8 d 2 u 3', 'order.py': 'a 15 d 0 u 34', 'info.py': 'a 1 d 20 u 5'} for k,v in data.items(): sum=0 for x in data[k].split(' '): if x.isdigit(): sum+=int(x) print '文件:%s,共變更%d行'%(k,sum)
執行結果:
文件:login.py,共變更13行
文件:info.py,共變更26行
文件:order.py,共變更49行
第二種方法:通過try 方法:
data={'login.py': 'a 8 d 2 u 3', 'order.py': 'a 15 d 0 u 34', 'info.py': 'a 1 d 20 u 5'} for k,v in data.items(): sum=0 for x in data[k].split(' '): try: sum+=int(x) #通過try except方法捕獲異常,巧妙的實現 except: pass print '文件:%s,共變更%d行'%(k,sum)
2 定義一個函數func(listinfo) listinfo:為列表,listinfo = [133, 88, 24, 33, 232, 44, 11, 44],返回列表小于100,且為偶數的
def func(listinfo): for x in listinfo: try: result = filter(lambda k: k < 100 and k % 2 == 0, listinfo) except Exception as a: return a else: return result print func([133, 88, 24, 33, 232, 44, 11, 44])
輸出:[88, 24, 44, 44]
class my_error(Exception): def __init__(self, stri): self.leng = len(stri) def process(self): if self.leng < 5: return 'The input is of length %s,expecting at least 5' % self.leng else: return 'print success' try: raise my_error('sssss') except my_error as e: print e.process()
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。