異常拋出機制:爲程序開發人員提供一種在運行錯誤發現,進行恢復處理,然後繼續執行的能力。
範例:
>>> 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/python try: #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就可以捕獲異常;
[root@zabbix 123]# cat try.py #!/usr/bin/python try: open('abc.log') except NameError,msg: #當修改異常類型爲NameError pass [root@zabbix 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
#如果有多段代碼
[root@zabbix 123]# cat try.py #!/usr/bin/python try: open('test.log') #此處的test.log文件是存在的 print hello #此處的hello是一個變量,不是字符串 except IOError,msg: pass [root@zabbix 123]# python try.py Traceback (most recent call last): File "try.py", line 4, in <module> print hello NameError: name 'hello' is not defined#當執行到hello時,提示未命名;
言外之意:當程序出現異常時,程序會終止,隨後捕獲異常,如果再次出現異常,也可以再次捕獲
[root@zabbix 123]# cat try.py #!/usr/bin/python try: open('test.log') print hello except IOError,msg: pass except NameError,msg: pass [root@zabbix 123]# python try.py#當再次執行時,異常被掩蓋。
#再次強調異常的捕獲,是根據異常的名稱的定義的!
異常處理:pass 只是掩蓋了異常,並不是無任何其它操作,(例如定義一些異常處理的函數來解決問題)!
範例:
[root@zabbix 123]# cat try.py #!/usr/bin/python #coding:utf8 filename = raw_input("請輸入要操作的文件:") try: open(filename) print hellp except IOError,msg: print "指定的文件不存在,請重新輸入" except NameError,msg: print "內部變量調用錯誤!" [root@zabbix 123]# python try.py 請輸入要操作的文件:test.log 內部變量調用錯誤! [root@zabbix 123]# python try.py 請輸入要操作的文件:a.log 指定的文件不存在,請重新輸入 #處理可能出現問題的程序段,捕獲問題進行相應的處理。
拋出機制:
1、如果在運行時發生異常的話,解釋器會查找相應的處理語句(稱爲handler)
2、要是在當前函數裏沒有找到的話,它會將異常傳遞給上層的調用函數,看看那裏能不能處理。
3、如果在最外層(全局”main“)還是沒有找到的話,解釋器就會退出,同時打印出traceback以便讓用戶找出錯誤產生的原因。
#注意雖然大多數錯誤會導致異常,但一個異常不一定代表錯誤。有時候他們只是一個警告,有時候他們可能是一個終止信號,比如退出循環等。
finally字句:
Python提供try-finally子句,表達:不關心捕捉的錯誤,且錯誤是否發生,這些代碼必須執行,比如文件的關閉,釋放鎖,把數據庫鏈接返還給鏈接池等。
問題:
#!/usr/bin/python #coding:utf8 filename = raw_input("請輸入要操作的文件:") try: f = open(filename) print hellp except IOError,msg: print "指定的文件不存在,請重新輸入" except NameError,msg: print "內部變量調用錯誤!" print "over" f.close() print "that's all" [root@zabbix 123]# python try.py 請輸入要操作的文件:123 #此處f對象是無 指定的文件不存在,請重新輸入 over Traceback (most recent call last): File "try.py", line 12, in <module> f.close() #執行時出現問題 NameError: name 'f' is not defined
範例:
#!/usr/bin/python #coding:utf8 filename = raw_input("請輸入要操作的文件:") try: f = open(filename) print hellp except IOError,msg: print "指定的文件不存在,請重新輸入" except NameError,msg: print "內部變量調用錯誤!" finally: print "ok" [root@zabbix 123]# python try.py 請輸入要操作的文件:123 指定的文件不存在,請重新輸入 ok #注意finally子句執行
raise拋出異常:
例子:
#!/usr/bin/python #coding:utf8 filename = raw_input("請輸入要操作的文件:") try: f = open(filename) print hellp except IOError,msg: print "指定的文件不存在,請重新輸入" except NameError,msg: print "內部變量調用錯誤!" finally: print "ok" if filename == "hello": raise TypeError("noting!!!")
[root@zabbix 123]# python try.py 請輸入要操作的文件:new.log 內部變量調用錯誤! ok [root@zabbix 123]# python try.py 請輸入要操作的文件:hello 指定的文件不存在,請重新輸入 ok Traceback (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異常: