python高級-異常(13)

1、異常介紹

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

運行結果爲:數據庫

1--------------------- Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\demo.py", line 2, in <module> open("123.txt","r") FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

說明:打開一個不存在的文件123.txt,當找不到123.txt 文件時,就會拋出給咱們一個IOError類型的錯誤,No such file or directory:123.txt (沒有123.txt這樣的文件或目錄)函數

異常:當Python檢測到一個錯誤時,解釋器就沒法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的」異常」ui

 

2、捕獲異常

try…except…spa

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

運行結果爲:1---------------------code

說明:對象

  • 此程序看不到任何錯誤,由於用except 捕獲到了IOError異常,並添加了處理的方法
  • pass 表示實現了相應的實現,但什麼也不作;若是把pass改成print語句,那麼就會輸出其餘信息
  • 把可能出現問題的代碼,放在try中
  • 把處理異常的代碼,放在except中

 

3、except捕獲多個異常

try: print(num) except IOError: print("產生的錯誤")

運行結果爲:blog

Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 2, in <module>
    print(num) NameError: name 'num' is not defined

上例程序,已經使用except來捕獲異常了,爲何還會看到錯誤的信息提示?由於:except捕獲的錯誤類型是IOError,而此時程序產生的異常爲 NameError ,因此except沒有生效開發

修改後的代碼爲:input

try: print(num) except NameError: print("產生的錯誤")

運行結果爲:產生的錯誤it

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

try: print("1---------------------") open("123.txt","r") print("2---------------------") print(num) except (IOError,NameError): print("產生的錯誤")

運行結果爲:

1--------------------- 產生的錯誤

當捕獲多個異常時,能夠把要捕獲的異常的名字,放到except 後,並使用元組的方式僅進行存儲

 

4、獲取異常的信息描述

try: print("1---------------------") open("123.txt","r") print("2---------------------") except Exception as e:#Exception是異常類,e是捕獲到的異常
    print(e)

運行結果爲:

1--------------------- [Errno 2] No such file or directory: '123.txt'

 

5、else

在if中,else的做用是當條件不知足時執行的實行;一樣在try…except…中也是如此,即若是沒有捕獲到異常,那麼就執行else中的事情

try: num = 100
except Exception as e:#Exception是異常類,e是捕獲到的異常
    print("產生錯位了:%s"%e) else: print("沒有捕獲異常,真高興")

運行結果爲:沒有捕獲異常,真高興

 

6、try…finally…

在程序中,若是一個段代碼必需要執行,即不管異常是否產生都要執行,那麼此時就須要使用finally。 好比文件關閉,釋放鎖,把數據庫鏈接返還給鏈接池等

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從句仍然被執行,把文件關閉。

 

7、異常的傳遞

def test1(): print("------test1-1-------") print(num) print("------test1-2-------") def test2(): print("------test2-1-------") test1() print("------test2-2-------") def test3(): try: print("------test3-1-------") test1() print("------test3-2-------") except Exception as e: print("捕獲到了異常,信息是:%s"%e) test3() print("--------------------------------------") test2()

運行結果爲:

------test3-1-------
------test1-1------- 捕獲到了異常,信息是:name 'num' is not defined --------------------------------------
------test2-1-------
------test1-1------- Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 21, in <module> test2() File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 8, in test2 test1() File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 3, in test1 print(num) NameError: name 'num' is not defined
  • 若是try嵌套,那麼若是裏面的try沒有捕獲到這個異常,那麼外面的try會接收到這個異常,而後進行處理,若是外邊的try依然沒有捕獲到,那麼再進行傳遞。。。
  • 若是一個異常是在一個函數中產生的,例如函數A—->函數B—->函數C,而異常是在函數C中產生的,那麼若是函數C中沒有對這個異常進行處理,那麼這個異常會傳遞到函數B中,若是函數B有異常處理那麼就會按照函數B的處理方式進行執行;若是函數B也沒有異常處理,那麼這個異常會繼續傳遞,以此類推。。。若是全部的函數都沒有處理,那麼此時就會進行異常的默認處理,即一般見到的那樣
  • 注意觀察上圖中,當調用test3函數時,在test1函數內部產生了異常,此異常被傳遞到test3函數中完成了異常處理,而當異常處理完後,並無返回到函數test1中進行執行,而是在函數test3中繼續執行

 

8、拋出自定義的異常

用raise語句來引起一個異常。異常/錯誤對象必須有一個名字,且它們應是Error或Exception類的子類

class ShortInputException(Exception): def __init__(self,length,atleast): self.length = length self.atleast = atleast def main(): try: s = input("請輸入:") if len(s)<3: raise ShortInputException(len(s),3) except ShortInputException as e: print("ShortInputException:輸入的長度是%d,長度至少是%d"%(e.length,e.atleast)) else: print("沒有發生異常") main()

運行結果爲:

請輸入:qw
ShortInputException:輸入的長度是2,長度至少是3

請輸入:qwert
沒有發生異常

相關文章
相關標籤/搜索