標籤:python 異常處理
異常拋出機制:為程式開發人員提供一種在運行錯誤發現,進行恢複處理,然後繼續執行的能力。
範例:
>>> try:... f = open(‘unfile.py‘,‘r‘)... except IOError, e:... print False, str(e)... False [Errno 2] No such file or directory: ‘unfile.py‘
#!/usr/bin/pythontry: #try嘗試執行代碼 open(‘abc.log‘)except IOError,msg: #except接受異常,注意異常的名稱要相符,通過變數接受異常資訊 pass #佔位
#執行代碼時沒有任何問題,但這個代碼是打不開的。
*msg變數解釋,只是接受錯誤的資訊:
.... except IOError,msg: print msg 執行後代碼後,列印相關錯誤 [Errno 2] No such file or directory: ‘abc.log‘
#如果直接執行:
open(‘abc.log‘)#報錯:Traceback (most recent call last): File "try.py", line 6, in <module> open(‘abc.log‘)IOError: [Errno 2] No such file or directory: ‘abc.log‘
異常類型注意:異常類型,並不是直接使用except就可以捕獲異常;
[[email protected] 123]# cat try.py #!/usr/bin/pythontry: open(‘abc.log‘)except NameError,msg: #當修改異常類型為NameError pass[[email protected] 123]# python try.py Traceback (most recent call last): File "try.py", line 3, in <module> open(‘abc.log‘)IOError: [Errno 2] No such file or directory: ‘abc.log‘
#執行後IOError同樣會報錯,except並沒有捕獲NameError
#如果有多段代碼
[[email protected] 123]# cat try.py #!/usr/bin/pythontry: open(‘test.log‘) #此處的test.log檔案是存在的 print hello #此處的hello是一個變數,不是字串except IOError,msg: pass[[email protected] 123]# python try.py Traceback (most recent call last): File "try.py", line 4, in <module> print helloNameError: name ‘hello‘ is not defined
#當執行到hello時,提示未命名;
言外之意:當程式出現異常時,程式會終止,隨後捕獲異常,如果再次出現異常,也可以再次捕獲
[[email protected] 123]# cat try.py #!/usr/bin/pythontry: open(‘test.log‘) print helloexcept IOError,msg: passexcept NameError,msg: pass[[email protected] 123]# python try.py
#當再次執行時,異常被掩蓋。
#再次強調異常的捕獲,是根據異常的名稱的定義的!
異常處理:pass 只是掩蓋了異常,並不是無任何其它操作,(例如定義一些異常處理的函數來解決問題)!
範例:
[[email protected] 123]# cat try.py #!/usr/bin/python#coding:utf8filename = raw_input("請輸入要操作的檔案:")try: open(filename) print hellpexcept IOError,msg: print "指定的檔案不存在,請重新輸入"except NameError,msg: print "內部變數調用錯誤!"[[email protected] 123]# python try.py 請輸入要操作的檔案:test.log內部變數調用錯誤![[email protected] 123]# python try.py 請輸入要操作的檔案:a.log指定的檔案不存在,請重新輸入#處理可能出現問題的程式段,捕獲問題進行相應的處理。
拋出機制:
1、如果在運行時發生異常的話,解譯器會尋找相應的處理語句(稱為handler)
2、要是在當前函數裡沒有找到的話,它會將異常傳遞給上層的調用函數,看看那裡能不能處理。
3、如果在最外層(全域”main“)還是沒有找到的話,解譯器就會退出,同時列印出traceback以便讓使用者找出錯誤產生的原因。
#注意雖然大多數錯誤會導致異常,但一個異常不一定代表錯誤。有時候他們只是一個警告,有時候他們可能是一個終止訊號,比如退出迴圈等。
finally字句:
Python提供try-finally子句,表達:不關心捕捉的錯誤,且錯誤是否發生,這些代碼必須執行,比如檔案的關閉,釋放鎖,把資料庫連結返還給連結池等。
問題:
#!/usr/bin/python#coding:utf8filename = raw_input("請輸入要操作的檔案:")try: f = open(filename) print hellpexcept IOError,msg: print "指定的檔案不存在,請重新輸入"except NameError,msg: print "內部變數調用錯誤!"print "over"f.close()print "that‘s all"[[email protected] 123]# python try.py 請輸入要操作的檔案:123 #此處f對象是無指定的檔案不存在,請重新輸入overTraceback (most recent call last): File "try.py", line 12, in <module> f.close() #執行時出現問題NameError: name ‘f‘ is not defined
範例:
#!/usr/bin/python#coding:utf8filename = raw_input("請輸入要操作的檔案:")try: f = open(filename) print hellpexcept IOError,msg: print "指定的檔案不存在,請重新輸入"except NameError,msg: print "內部變數調用錯誤!"finally: print "ok"[[email protected] 123]# python try.py 請輸入要操作的檔案:123指定的檔案不存在,請重新輸入ok#注意finally子句執行
raise拋出異常:
例子:
#!/usr/bin/python#coding:utf8filename = raw_input("請輸入要操作的檔案:")try: f = open(filename) print hellpexcept IOError,msg: print "指定的檔案不存在,請重新輸入"except NameError,msg: print "內部變數調用錯誤!"finally: print "ok"if filename == "hello": raise TypeError("noting!!!")
[[email protected] 123]# python try.py 請輸入要操作的檔案:new.log內部變數調用錯誤!ok[[email protected] 123]# python try.py 請輸入要操作的檔案:hello指定的檔案不存在,請重新輸入okTraceback (most recent call last): File "try.py", line 14, in <module> raise TypeError("noting!!!")TypeError: noting!!!#此處拋出異常
注意:異常的類型不可以隨便指定,需python中可以識別、正常處理的異常。
如:
........if filename == "hello": raise OtherError("noting!!!")執行後:Traceback (most recent call last): File "try.py", line 14, in <module> raise OtherError("noting!!!")NameError: name ‘OtherError‘ is not defined
常見的python異常:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/3B/wKiom1V2rviCTu6-AAQU5p8hS-0629.jpg" title="}9MKJK{_3][2_1`W9]A9@(A.jpg " alt="wKiom1V2rviCTu6-AAQU5p8hS-0629.jpg" />
本文出自 “思想大於技術” 部落格,謝絕轉載!
python 異常處理