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/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異常:

wKiom1V2rviCTu6-AAQU5p8hS-0629.jpg




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章