W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
try...except...是處理異常的基本方式。在原來的基礎(chǔ)上,還可有擴(kuò)展。
處理多個(gè)異常,并不是因?yàn)橥瑫r(shí)報(bào)出多個(gè)異常。程序在運(yùn)行中,只要遇到一個(gè)異常就會(huì)有反應(yīng),所以,每次捕獲到的異常一定是一個(gè)。所謂處理多個(gè)異常的意思是可以容許捕獲不同的異常,有不同的except子句處理。
#!/usr/bin/env python
# coding=utf-8
while 1:
print "this is a division program."
c = raw_input("input 'c' continue, otherwise logout:")
if c == 'c':
a = raw_input("first number:")
b = raw_input("second number:")
try:
print float(a)/float(b)
print "*************************"
except ZeroDivisionError:
print "The second number can't be zero!"
print "*************************"
except ValueError:
print "please input number."
print "************************"
else:
break
將上節(jié)的一個(gè)程序進(jìn)行修改,增加了一個(gè)except子句,目的是如果用戶輸入的不是數(shù)字時(shí),捕獲并處理這個(gè)異常。測試如下:
$ python 21701.py
this is a division program.
input 'c' continue, otherwise logout:c
first number:3
second number:"hello" #輸入了一個(gè)不是數(shù)字的東西
please input number. #對(duì)照上面的程序,捕獲并處理了這個(gè)異常
************************
this is a division program.
input 'c' continue, otherwise logout:c
first number:4
second number:0
The second number can't be zero!
*************************
this is a division program.
input 'c' continue, otherwise logout:4
$
如果有多個(gè)except,在try里面如果有一個(gè)異常,就轉(zhuǎn)到相應(yīng)的except子句,其它的忽略。如果except沒有相應(yīng)的異常,該異常也會(huì)拋出,不過這是程序就要中止了,因?yàn)楫惓!案〕觥背绦蝽敳俊?/p>
除了用多個(gè)except之外,還可以在一個(gè)except后面放多個(gè)異常參數(shù),比如上面的程序,可以將except部分修改為:
except (ZeroDivisionError, ValueError):
print "please input rightly."
print "********************"
運(yùn)行的結(jié)果就是:
$ python 21701.py
this is a division program.
input 'c' continue, otherwise logout:c
first number:2
second number:0 #捕獲異常
please input rightly.
********************
this is a division program.
input 'c' continue, otherwise logout:c
first number:3
second number:a #異常
please input rightly.
********************
this is a division program.
input 'c' continue, otherwise logout:d
$
需要注意的是,except后面如果是多個(gè)參數(shù),一定要用圓括號(hào)包裹起來。否則,后果自負(fù)。
突然有一種想法,在對(duì)異常的處理中,前面都是自己寫一個(gè)提示語,發(fā)現(xiàn)自己寫的不如內(nèi)置的異常錯(cuò)誤提示更好。希望把它打印出來。但是程序還能不能中斷。python提供了一種方式,將上面代碼修改如下:
while 1:
print "this is a division program."
c = raw_input("input 'c' continue, otherwise logout:")
if c == 'c':
a = raw_input("first number:")
b = raw_input("second number:")
try:
print float(a)/float(b)
print "*************************"
except (ZeroDivisionError, ValueError), e:
print e
print "********************"
else:
break
運(yùn)行一下,看看提示信息。
$ python 21702.py
this is a division program.
input 'c' continue, otherwise logout:c
first number:2
second number:a #異常
could not convert string to float: a
********************
this is a division program.
input 'c' continue, otherwise logout:c
first number:2
second number:0 #異常
float division by zero
********************
this is a division program.
input 'c' continue, otherwise logout:d
$
在python3.x中,常常這樣寫:
except (ZeroDivisionError, ValueError) as e:
以上程序中,之處理了兩個(gè)異常,還可能有更多的異常呢?如果要處理,怎么辦?可以這樣:execpt:
或者except Exception, e
,后面什么參數(shù)也不寫就好了。
有了try...except...
,在一般情況下是夠用的,但總有不一般的時(shí)候出現(xiàn),所以,就增加了一個(gè)else子句。其實(shí),人類的自然語言何嘗不是如此呢?總要根據(jù)需要添加不少東西。
>>> try:
... print "I am try"
... except:
... print "I am except"
... else:
... print "I am else"
...
I am try
I am else
這段演示,能夠幫助讀者理解else的執(zhí)行特點(diǎn)。如果執(zhí)行了try,則except被忽略,但是else被執(zhí)行。
>>> try:
... print 1/0
... except:
... print "I am except"
... else:
... print "I am else"
...
I am except
這時(shí)候else就不被執(zhí)行了。
理解了else的執(zhí)行特點(diǎn),可以寫這樣一段程序,還是類似于前面的計(jì)算,只不過這次要求,如果輸入的有誤,就不斷要求從新輸入,知道輸入正確,并得到了結(jié)果,才不再要求輸入內(nèi)容,程序結(jié)束。
在看下面的參考代碼之前,讀者是否可以先自己寫一段呢?并調(diào)試一下,看看結(jié)果如何。
#!/usr/bin/env python
# coding=utf-8
while 1:
try:
x = raw_input("the first number:")
y = raw_input("the second number:")
r = float(x)/float(y)
print r
except Exception, e:
print e
print "try again."
else:
break
先看運(yùn)行結(jié)果:
$ python 21703.py
the first number:2
the second number:0 #異常,執(zhí)行except
float division by zero
try again. #循環(huán)
the first number:2
the second number:a #異常
could not convert string to float: a
try again.
the first number:4
the second number:2 #正常,執(zhí)行try
2.0 #然后else:break,退出程序
$
相當(dāng)滿意的執(zhí)行結(jié)果。
需要對(duì)程序中的except簡單說明,這次沒有像前面那樣寫,而是except Exception, e
,意思是不管什么異常,這里都會(huì)捕獲,并且傳給變量e,然后用print e
把異常信息打印出來。
finally子句,一聽這個(gè)名字,就感覺它是做善后工作的。的確如此,如果有了finally,不管前面執(zhí)行的是try,還是except,它都要執(zhí)行。因此一種說法是用finally用來在可能的異常后進(jìn)行清理。比如:
>>> x = 10
>>> try:
... x = 1/0
... except Exception, e:
... print e
... finally:
... print "del x"
... del x
...
integer division or modulo by zero
del x
看一看x是否被刪除?
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
當(dāng)然,在應(yīng)用中,可以將上面的各個(gè)子句都綜合起來使用,寫成如下樣式:
try:
do something
except:
do something
else:
do something
finally
do something
try...except...
在某些情況下能夠替代if...else..
的條件語句。這里我無意去比較兩者的性能,因?yàn)榭吹接腥擞懻撨@個(gè)問題。我個(gè)人覺得這不是主要的,因?yàn)樗鼈冎g性能的差異不大。主要是你的選擇。一切要根據(jù)實(shí)際情況而定,不是說用一個(gè)就能包打天下。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: