python中的異常處理以及簡單練習題目

2021-08-28 23:39:29 字數 4461 閱讀 3810

什麼是異常?

異常是python物件,表示乙個錯誤。當python指令碼發生異常時我們需要捕獲處理它,否則程式會終止執行。在程式執行過程中,總會遇到各種各樣的錯誤,有的錯誤是程式編寫有問題造成的

還有一類錯誤是完全無法在程式執行過程中**的:一切異常皆是物件

系統定義的異常:

baseexception 所有異常的基類,父類    

exception 常規錯誤的基類

standarderror 所有的內建標準異常的基類,標準化錯誤

importerror  匯入模組錯誤

arithmeticerror 所有數值計算錯誤的基類

floatingpointerror 浮點計算錯誤

assertionerror  斷言語句失敗

attributeerror  物件沒有這個屬性

warning 警告的基類警告類

也可以自定義異常,建立類,

異常處理的作用是:

1:不想讓程式終止

2:如果出錯了,需要特殊處理

異常處理的語法是:try/except語句,有的後面也會加else

try:

a = 2

b = 0

print a / b

except:

print '出錯啦!!!'

print 1111

try ....except...else 語句,當沒有異常發生時,else中的語句將會被執行。

a=10

b=1try:

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

出錯啦!!!

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丟擲解釋:如果錯誤沒有**獲,它就會一直往上拋,最後被python直譯器捕獲,列印乙個錯誤資訊,然後程式退出:語法:raise 異常類名 (錯誤資訊)

練習題:#1.編寫乙個計算減法的方法,當第乙個數小於第二個數時,丟擲「被減數不能小於減數"的異常

練習題:

1.從開發的**庫中得到一組資料,表示每個檔案的**變更情況

其中 a表示新增行數,d表示刪除行數,u表示修改行數。login.py的變更行數為13

要求:統計出每個檔案的變更行數

第一種方法:通過if語句,判斷

data=

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=

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]

3 自己定義乙個異常類,繼承exception類, 捕獲下面的過程:判斷raw_input()輸入的字串長度是否小於5, 

如果小於5,比如輸入長度為3則輸出:" the input is of length 3,expecting at least 5',大於5輸出"print success' 

""" 

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'

python 什麼是異常處理以及異常處理的兩種方式

attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x ioerror 輸入 輸出異常 基本上是無法開啟檔案 importerror 無法引入模組或包 基本上是路徑問題或名稱錯誤 indentationerror 語法錯誤 的子類 沒有正確對齊 indexer...

python 中的異常處理

python的異常處理能力是很強大的,可向使用者準確反饋出錯資訊。在python中,異常也是物件,可對它進行操作。所有異常都是基類exception的成員。所有異常都從基類exception繼承,而且都在exceptions模組中定義。python自動將所有異常名稱放在內建命名空間中,所以程式不必匯...

Python中的異常處理

當python檢測到乙個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的 異常 看如下示例 try print test1 open 123.txt r print test2 except ioerror pass此時可以正常執行,執行結果為 test1 說明 try exc...