1. 程式人生 > >python中的異常處理以及簡單練習題目

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

什麼是異常?

異常是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=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的兩個作用:

  1. 可以提高程式碼健壯性,
  2. 捕獲異常,巧妙的避開報錯的資訊

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]
  1. 3 自己定義一個異常類,繼承Exception類, 捕獲下面的過程:判斷raw_input()輸入的字串長度是否小於5, 
  2. 如果小於5,比如輸入長度為3則輸出:" The input is of length 3,expecting at least 5',大於5輸出"print success' 
  3. """
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()