Windows上python開發 5 異常處理

2021-06-22 03:41:56 字數 4571 閱讀 4970

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...