Python 異常處理

異常:

當Python檢測到⼀個錯誤時,解釋器就⽆法繼續執⾏了,會出現⼀些錯誤的提示,這就是所謂的"異常"。

看如下示例:

print('-----test--1---')
open('123.txt','r')
print('-----test--2---')

打開⼀個不存在的⽂件123.txt,當找不到123.txt ⽂件時,就會拋出給我們⼀個IOError類型的錯誤,No such file or directory:123.txt (沒有123.txt這樣的⽂件或⽬錄)

 


異常處理

1. 捕獲異常 try...except...
看如下示例:

try:
    print('-----test--1---')
    open('123.txt','r')
    print('-----test--2---')
except IOError:
    pass

說明:

  • 此程序看不到任何錯誤,因爲⽤except 捕獲到了IOError異常,並添加了處理的⽅法
  • pass 表示實現了相應的實現,但什麼也不做;如果把pass改爲print語句,那麼就會輸出其他信息

⼩總結:

  • 把可能出現問題的代碼,放在try中
  • 把處理異常的代碼,放在except中

 

2. except捕獲多個異常
看如下示例:

try:
    print num
except IOError:
    print('產⽣錯誤了')

想⼀想: 上例程序,已經使⽤except來捕獲異常了,爲什麼還會看到錯誤的信息提示?

  • 答: except捕獲的錯誤類型是IOError,⽽此時程序產⽣的異常爲 NameError ,所以except沒有⽣效

修改後的代碼爲:

try:
    print(num)
except NameError:
    print('產⽣錯誤了')

實際開發中,捕獲多個異常的⽅式,如下:

try:
    print('-----test--1---')
    open('123.txt','r') # 如果123.txt⽂件不存在,那麼會產⽣ IOError 異常
    print('-----test--2---')
    print(num)# 如果num變量沒有定義,那麼會產⽣ NameError 異常
except (IOError,NameError):
    #  如果想通過⼀次except捕獲到多個異常可以⽤⼀個元組的⽅式

注意:

  • 當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 後,並使⽤元組的⽅式僅進⾏存儲

 

3. 獲取異常的信息描述

 

4. 捕獲所有異常

 

5. else
        咱們應該對 else  並不陌⽣,在if中,它的作⽤是當條件不滿⾜時執⾏的實⾏;同樣在try...except...中也是如此,即如果沒有捕獲到異常,那麼就執⾏else中的事情。

try:
    num = 100
    print num
except NameError as errorMsg:
    print('產⽣錯誤了:%s'%errorMsg)
else:
    print('沒有捕獲到異常,真⾼興')

運行結果如下:



6. try...finally...
        ⽆論異常是否產⽣都要執⾏,那麼此時就需要使⽤finally。如⽂件關閉,釋放鎖,把數據庫連接返還給連接池等。
demo:

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
        #如果在讀取⽂件的過程中,產⽣了異常,那麼就會捕獲到
        #⽐如 按下了 ctrl+c
        pass
    finally:
        f.close()
        print('關閉⽂件')

except:
    print("沒有這個⽂件")

說明:
        test.txt⽂件中每⼀⾏數據打印,但是我有意在每打印⼀⾏之前⽤time.sleep⽅法暫停2秒鐘。這樣做的原因是讓程序運⾏得慢⼀些。在程序運⾏的時候,按Ctrl+c中斷(取消)程序。
        可以觀察到KeyboardInterrupt異常被觸發,程序退出。但是在程序退出之前,finally從句仍然被執⾏,把⽂件關閉。

 


異常的傳遞

1. try嵌套中

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
                time.sleep(2)
                print(content)
    finally:
            f.close()
            print('關閉⽂件')
except:
    print("沒有這個⽂件")

運⾏結果:

^C關閉⽂件
沒有這個⽂件

總結:

  • try嵌套時,如果⾥⾯的try沒有捕獲到這個異常,那麼外⾯的try會接收到這個異常,然後進⾏處理。
  • 如果外邊的try依然沒有捕獲到,那麼再進⾏傳遞。。。


2. 函數嵌套調⽤中

def test1():
    print("----test1-1----")
    print(num)
    print("----test1-2----")

def test2():
    try:
        print("----test2-1----")
        test1()
        print("----test2-2----")

    except:
        print("test2出現異常")
        print("----test2-3----")
        test2()
        print("------華麗的分割線-----")

總結
        如果try嵌套,那麼如果⾥⾯的try沒有捕獲到這個異常,那麼外⾯的try會接收到這個異常,然後進⾏處理,如果外邊的try依然沒有捕獲到,那麼再進⾏傳遞。。。
        如果⼀個異常是在⼀個函數中產⽣的,例如函數A---->函數B---->函數C,⽽異常是在函數C中產⽣的,那麼如果函數C中沒有對這個異常進⾏處理,那麼這個異常會傳遞到函數B中,如果函數B有異常處理那麼就會按照函數B的處理⽅式進⾏執⾏;如果函數B也沒有異常處理,那麼這個異常會繼續傳遞,以此類推。。。如果所有的函數都沒有處理,那麼此時就會進⾏異常的默認處理,即通常到的那樣。


拋出自定義的異常

可以⽤raise語句來引發⼀個異常。異常/錯誤對象必須有⼀個名字,且它們應是Error或Exception類的⼦類。
下⾯是⼀個引發異常的例⼦:

class ShortInputException(Exception):
'''⾃定義的異常類'''
    def __init__(self, length, atleast):
        #super().__init__()
        self.length = length
        self.atleast = atleast

    def main():
        try:
            s = input('請輸⼊ --> ')
            if len(s) < 3:
                # raise引發⼀個你定義的異常
                raise ShortInputException(len(s), 3)
        except ShortInputException as result:    #x這個變量被綁定到了錯誤的實例
            print('ShortInputException: 輸⼊的度是 %d,度⾄少應是 %d'% (result.length, result.atleast))
        else:
            print('沒有異常發⽣.')

main()

 

Python更多:https://blog.csdn.net/Scrat_Kong/article/details/90257118

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章