Python(異常處理與程式除錯)

2021-08-11 11:54:06 字數 4522 閱讀 2264

python標準庫的每個模組都使用了異常,異常在python中除了可以捕獲錯誤,還可以除錯程式。

一、python中的異常

異常是指程式中的例外、違例情況。異常機制是指當程式出現錯誤後,程式的處理方法。異常機制提供了程式正常退出的安全通道。當錯誤出現後,程式的流程發生改變,程式的控制權轉移到異常處理器,當異常被引發時,如果沒有**處理該異常,異常將被python接收處理。當異常發生時,python直譯器將輸出一些相關的資訊並終止程式的執行。

在python3中,baseexception是所有異常類的基類,所有的內建異常都是它的派生類,exception是除了systemexit、generatorexit和keyboardinterrupt之外的所有內建異常的基類,使用者自定義的異常在應該繼承它。

eeception異常類包括:

(1)stopitertion,當迭代器中沒有資料項時觸發,由內建函式next()和迭代器的next()方法觸發。

(2)arithmeticerror,演算法異常的基類,包括溢位異常,零除異常和浮點數操作失敗異常。

(3)assertionerror,assert語句失敗時觸發。

(4)eoferror,檔案末尾,使用內建函式inpiut()時生成,表示到達檔案末尾,但是如read()和readline()等大多數i/o操作將返回乙個空字串來表示eof,而不是引發異常。

(5)lookuperror,當使用對映或者序列時,如果鍵值或者索引無法找到時觸發,它是keyerror和indexerror的基類。

(6)referenceerror,引用異常,當底層物件被銷毀後訪問弱引用時觸發。

(7)warning,警告,warnings模組,用來通知程式設計師不支援的功能。

python內的異常使用繼承結構建立,在這種設計方式非常靈活,可以在異常處理程式中捕獲基類異常,也可以捕獲各種子類異常,python使用try…except語句捕獲異常,異常型別定義在try子句後面。如果在except子句後將異常型別設定為exception,異常處理程式將捕獲除了程式中中斷以外的所有異常,因為exception類是其他異常類的基類。

*try…except的使用:

try…excepr語句用於處理問題語句,捕獲可能出現的異常,try子句中放置可能出現異常的語句,except子句中的**塊處理異常,當異常出現時,python會自動生成乙個異常物件,該物件包括異常的具體資訊,以及異常的種類和錯誤位置。

#filenotfounderror

#try子句中寫可能會出現異常的**,在except子句後定義異常型別,用於python直譯器正確捕捉到發生的異常

#except子句中寫異常發生時程式做出的處理動作

try:

open('try.txt','r') #嘗試讀取乙個不存在的檔案,由於檔案不存在,程式立即跳轉至except語句處

print('讀檔案')

except filenotfounderror: #捕獲該異常型別的異常並做出處理

print('檔案不存在')

except: #當捕獲其他異常時做出的處理

print('程式異常')

#zerodivisionerror

print()

try:

result = 10 / 0

except zerodivisionerror:

print('除法中除數不能為0!')

else:

print('result:',result)

result_1 = 10 / 2

print('result_1:',result_1)

#try...except巢狀

print()

try:

s = 'hello'

try:

print(s[0]+s[1])

print(s[0]-s[1])

except typeerror:

print('字串不支援減法操作')

except:

print('其他異常')

try…except巢狀語句通常用於釋放已經建立的系統資源

*try…finally的使用

try…except語句後還可以新增乙個finally子句,無論異常是否發生,finally子句都會被執行。所有的子句通常用於關閉異常而不能釋放的系統資源。

#try...finally

try:

f = open('try.txt')

try:

print(f.read())

except:

print('讀檔案錯誤')

finally: #由於變數f定義在外層的try子句中,因此內層的finally子句可以使用變數f,無**件讀取的異常是否發生,f.close()語句都會被執行

print('關閉檔案')

f.close()

except filenotfounderror:

print('檔案不存在')

注意:如果要在某個**段中使用同一級其他**塊中定義的變數,可以考慮巢狀的方式或全域性變數來實現。

*使用raise丟擲異常

try:

s = none

if s is

none:

print('s是空物件')

raise nameerror #如果變數s的值為空,則丟擲異常nameerror

print(len(s)) #由於引發了異常,所以該**及後面的**將不會被執行

# except typeerror:

# print('空物件沒有長度')

except nameerror:

print('空物件沒有長度')

raise語句通常用於拋出自定義異常,因為自定義異常並不在python的控制範圍之內,不會被python自動丟擲,應使用raise語句手工丟擲。

*自定義異常

python允許程式設計師自定義異常型別,用於描述python異常體系中沒有涉及到的異常情況,自定義異常必須繼承exception類,自定義異常按照命名規則以 error結尾,顯示地說明該類是異常類,自定義異常使用raise語句引發,而且只能通過手工方式觸發。

from __future__ import division

class

divisionexception

(exception):

def__init__

(self,x,y):

exception.__init__(self,x,y)

self.x = x

self.y = y

if __name__ == "__main__":

try:

x = 3

y = 2

if (x % y > 0):

print(x/y)

# raise divisionexception(x,y) #手工拋出自定義異常,

except divisionexception:

print('x/y = %.2f'%(x/y))

*assert語句的使用

assert語句用於檢測某個條件表示式是否為真,assert語句又稱為斷言語句,即assert認為檢測的表示式永遠為真,if語句中的條件判斷都可以用assert語句檢測,如果斷言失敗,則會引發assertionerror異常。

t = ('hello',)

assert len(t)>=1

t = ('hello')

assert len(t)==1

執行結果:

d

:\anaconda3\python.exe e

:/demo_py/python/char_9/assert.py

traceback (most recent call last):

file

"e:/demo_py/python/char_9/assert.py", line 6, in

assert len(t)==1

assertionerror

程序已結束,退出**1

assert語句還可以傳遞提示資訊給assertion異常。

assert 1

<=month

<=12,'month errors'

執行結果:

d

:\anaconda3\python.exe e

:/demo_py/python/char_9/assert.py

traceback (most recent call last):

file

"e:/demo_py/python/char_9/assert.py", line 9, in

assert 1

<=month<=12,'month errors'

assertionerror

: month errors

程序已結束,退出**1

python異常處理與程式除錯

使用try語句進行處理異常。一般形式如下 try 要進行捕捉異常的語句 except 異常語句 對異常進行處理的語句 except 異常語句 對異常進行處理的語句 else 未發生異常執行的語句 例1 l 1,2,3,4 try l 7 except 未填寫異常名則表示捕獲所有異常 print er...

Python異常處理 程式除錯

1 異常處理語句 1.1 try.except.else 說明 1 把可能產生的異常 放在try語句塊中,把處理結果放在except語句塊中。2 這樣,當try語句塊中的 出現錯誤時。就會執行except語句塊中的 3 如果try語句塊的 沒有錯誤,那麼except語句塊不會執行。語法格式 try ...

Python 六 異常的處理與程式除錯

a 3 b 0 try c a b print c except zerodivisionerror print 除數不能為0 print end 除數不能為0 endpython內建的異常類 異常類說明 nameerror 嘗試訪問乙個為宣告的變數 zerodivisionerror 除數為0 i...