python的異常處理能力是很強大的,可向使用者準確反饋出錯資訊。在python中,異常也是物件,可對它進行操作。所有異常都是基類exception的成員。所有異常都從基類exception繼承,而且都在exceptions模組中定義。python自動將所有異常名稱放在內建命名空間中,所以程式不必匯入exceptions模組即可使用異常。一旦引發而且沒有捕捉systemexit異常,程式執行就會終止。如果互動式會話遇到乙個未**捉的systemexit異常,會話就會終止。
try/except:捕捉由**中的異常並恢復,匹配except裡面的錯誤,並自行except中定義的**,後繼續執行程式(發生異常後,由except捕捉到異常後,不會中斷程式,繼續執行try語句後面的程式)
try/finally: 無論異常是否發生,都執行清理行為 (發生異常時程式會中斷程式,只不過會執行finally後的**)
raise: 手動在**中接觸發異常。
assert: 有條件地在程式**中觸發異常。
with/as 實現環境管理器。
1:try語句:
該種異常處理語法的規則是:
執行try下的語句,如果引發異常,則執行過程會跳到第乙個except語句。
如果第乙個except中定義的異常與引發的異常匹配,則執行該except中的語句。
如果引發的異常不匹配第乙個except,則會搜尋第二個except,允許編寫的except數量沒有限制。
如果所有的except都不匹配,則異常會傳遞到下乙個呼叫本**的最高層try**中。
如果沒有發生異常,則執行else塊**。
使用者定義的異常要寫成類的例項,而不是字串。
finally可以和except和else分句出現在相同的try語句內
1.1使用try和except語句來捕獲異常
try:
block
except [exception,[data…]]:
block
try的完整形式:try/多個except/else語句
else是可選的
try首行底下的**塊代表此語句的主要動作:試著執行的程式**。except分句定義try**塊內引發的異常處理器,而else分句(如果有)則是提供沒有發生異常時候要執行的處理器。
import sys
try:
s=raw_input('test eoferror:')
except eoferror:
print 'meet eoerror'
sys.exit()
except:
print 'hello'
1.2 使用try跟finally:
語法如下:
try:
block
finally:
block
該語句的執行規則是:
· 執行try下的**。
· 如果發生異常,在該異常傳遞到下一級try時,執行finally中的**。
· 如果沒有發生異常,則執行finally中的**。
第二種try語法在無論有沒有發生異常都要執行**的情況下是很有用的。例如我們在python中開啟乙個檔案進行讀寫操作,我在操作過程中不管是否出現異常,最終都是要把該檔案關閉的。
這兩種形式相互衝突,使用了一種就不允許使用另一種,而功能又各異
try:
f=open('dic.ini','w')
f.write('123')
finally:
print 'close file'
f.close()t
1.3 統一try/except/finally分句
try:
main-action:
except exception1:
hander1
except exception2:
hander2
...else:
else-block
finally:
finally-block
這語句中main-action**會先執行。如果該程式**(main-action)引發異常,那麼except**塊都會逐一測試,尋找與丟擲的異常相符的語句。如果引發異常的是exception1則會執行hander1**塊,如果引發異常的是exception2,則會執行hander2**塊。以此類推。如果沒有
引發異常,將會執行else-block**塊。
無論前面發生什麼,當main-action**塊完成時。finally-block都會執行。
2.用raise語句手工引發乙個異常: 自定義異常
raise [exception[,data]]
在python中,要想引發異常,最簡單的形式就是輸入關鍵字raise,後跟要引發的異常的名稱。異常名稱標識出具體的類:python異常是那些類的物件。執行raise語句時,python會建立指定的異常類的乙個物件。raise語句還可指定對異常物件進行初始化的引數。為此,請在異常類的名稱後新增乙個逗號以及指定的引數(或者由引數構成的乙個元組)。
例:try:
raise myerror #自己丟擲乙個異常
except myerror:
print 'a error'
class shortinputexception(exception):
'''''a user-defined exception class.'''
def __init__ (self, length, atleast):
exception.__init__(self)
self.length = length
self.atleast = atleast
try :
s = raw_input( 'enter something --> ')
if len (s) < 3 :
raise shortinputexception(len (s), 3 )
# other work can continue as usual here
except eoferror:
print '\nwhy did you do an eof on me?'
except shortinputexception, x:
print 'shortinputexception: the input was of length %d, \
was expecting at least %d' % (x.length,x.atleast)
else:
print 'no exception was raised.'
assert可以有條件地在程式**中觸發異常,可以認為是有條件的raise.
牢記:assert幾乎都是用來收集使用者定義的約束條件,而不是捕捉內在的程式設計錯誤。因為python會自動收集程式的設計錯誤,通常咩有必要寫assert去捕捉超出索引值,型別不匹配以及除數為0之類的事。
引發的異常為:assertionerror。如果沒有被try捕捉到,就會終止程式。
該語句形式:
assert ,
def f(x):
assert x>0,'x must be great zerot'
return x**2
f(-1)
3.內建exception類
python把內建異常組織成層次,來支援各種捕捉模式
exception: 異常的頂層根超類
standarderror: 所有內建錯誤異常的超類
arithmeticerror: 所有數值錯誤的超類
overflowerror: 識別特定的數值錯誤的子類
[python]
import exceptions
help(exceptions)
4. 採用sys模組回溯最後的異常
import sys
try:
block
except:
info=sys.exc_info()
print info[0],":",info[1]
或者以如下的形式:
import sys
tp,val,td = sys.exc_info()
sys.exc_info()的返回值是乙個tuple, (type, value/message, traceback)
這裡的type ---- 異常的型別
value/message ---- 異常的資訊或者引數
traceback ---- 包含呼叫棧資訊的物件。
從這點上可以看出此方法涵蓋了traceback.
習題:利用異常列印出行號和函式名稱 利用 raise
[python]
f = sys.exc_info()[2].tb_frame.f_back
f.f_code.co_name, f.f_lineno #函式名 行號
sayhello
在windows上秒開應用程式
一直習慣linux,windows反而不習慣了。圖形介面很慢有木有!那麼給你介紹一種酷炫的方式,讓你重新認識windows。滑鼠小,螢幕大,點起來好麻煩!對於我這種命令列摸習慣的人,所以比較希望在windows上通過cmd秒開你所想要的應用程式。好了,正文開始嘍。其實很簡單!只在w10上奏效,w7不...
Windows中的Python科學計算開發環境
1.spyder windows的命令列下輸入pip install spyder即可。此時,輸入spyder並不能出現spyder介面,需要另外安裝pyqt4或者pyqt5的安裝包。附 sypder installation官方文件 或者,直接安裝anaconda,spyder直接包含在其中。更新...
在windows上擴充套件python
在windows環境下建立乙個python的模組。使用vc6和python2.3 先講講做簡單的步驟 1。在vc6中建立乙個dll的project。假定我們的module的名字是mytest.那麼我們的dll名字就是mytest.dll。這個是必須的。2。用c寫我們想要實現的部分。步驟如下 incl...