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
try…except…spa
try: print("1---------------------") open("123.txt","r") print("2---------------------") except IOError: pass
運行結果爲:1---------------------code
說明:對象
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 後,並使用元組的方式僅進行存儲
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'
在if中,else的做用是當條件不知足時執行的實行;一樣在try…except…中也是如此,即若是沒有捕獲到異常,那麼就執行else中的事情
try: num = 100
except Exception as e:#Exception是異常類,e是捕獲到的異常
print("產生錯位了:%s"%e) else: print("沒有捕獲異常,真高興")
運行結果爲:沒有捕獲異常,真高興
在程序中,若是一個段代碼必需要執行,即不管異常是否產生都要執行,那麼此時就須要使用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從句仍然被執行,把文件關閉。
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
用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
沒有發生異常