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