1. 程式人生 > 其它 >異常簡介、捕獲異常

異常簡介、捕獲異常

技術標籤:《向著Python出發》python多執行緒

目錄

異常

1>異常簡介

2>說明

捕獲異常

1>捕獲異常try...except

2>except捕獲多個異常

3>捕獲異常的資訊描述

4>捕獲所有的異常

5>else

6>try...finally...


異常

1>異常簡介

print('-----test--1---')
open("123.txt","r")
print('-----test--2---')
##執行
Traceback (most recent call last):
  File "D:\python\CSDN\測試.py", line 743, in <module>
    open("123.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

2>說明

開啟一個不存在的檔案123.txt,當找不到123.txt 檔案時,就會丟擲給我們一個IOError型別的錯誤,No such file or directory:123.txt (沒有123.txt這樣的檔案或目錄)
異常:
當Python檢測到一個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的"異常"

捕獲異常

1>捕獲異常try...except

try:
    print('-----test--1---')
    open('123.txt','r')
    print('-----test--2---')
except IOError:
    pass
##執行
-----test--1---
說明:
此程式看不到任何錯誤,因為用except 捕獲到了IOError異常,並添加了處理的方法
pass 表示實現了相應的實現,但什麼也不做;如果把pass改為print語句,那麼就會輸出其他資訊

小結:

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

2>except捕獲多個異常

#conding=utf-8
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('沒有捕獲到異常,真高興')
###執行
100
沒有捕獲到異常,真高興

6>try...finally...

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("沒有這個檔案")
##執行
hello word,i am there

hello word,i am there
關閉檔案
#############################################說明
test.txt檔案中每一行資料列印,但是我有意在每列印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程式執行得慢一些。在程式執行的時候,按Ctrl+c中斷(取消)程式。

我們可以觀察到KeyboardInterrupt異常被觸發,程式退出。但是在程式退出之前,finally從句仍然被執行,把檔案關閉。