使用python編程的時候難免會出現各種各樣的錯誤,這些錯誤會使程序中斷。好在python解釋器會告訴你錯誤發生在什么位置以及錯誤產生的原因,便於我們進行修改和調試。有時候我們並不希望這種錯誤中斷程序的運行,於是通過異常處理能夠忽略本次異常讓程序繼續運行下去。
python中會發生兩種類型的錯誤。
1、語法錯誤:如果未遵循正確的語言語法,則會引發語法錯誤。
2、邏輯錯誤(異常):在運行時中,通過語法測試后發生錯誤的情況稱為異常或邏輯類型。
一、語法錯誤
string = 'Hello Word' if string == 'Hello' print('是Hello')
運行結果:
File "D:/python/lianxi/add.py", line 15 if string == 'Hello' ^ SyntaxError: invalid syntax
它就返回了語法錯誤的信息,用小箭頭告訴我們,if語句后面少了一個:(冒號)。
二、邏輯錯誤(異常)
shu = 10 result = shu / 0 print(resule)
運行結果:
Traceback (most recent call last): File "D:/python/lianxi/add.py", line 15, in <module> result = shu / 0 ZeroDivisionError: division by zero
拋出一個ZeroDivisionError異常,叫處理異常。
三、異常處理
我們可以通過使用 try..except 來處理異常狀況。一般來說我們會把通常的語句放在 try 代碼塊中,將我們的錯誤處理器代碼放置在 except 代碼塊中。
try: # 嘗試運行以下代碼 result = 5 / 2 print(result) except: # 捕獲到異常執行以下代碼 print('程序異常')
運行結果:
2.5
如果我們故意寫錯,看是怎么樣的:
try: # 嘗試運行以下代碼 result = 5 / 0 print(result) except: # 捕獲到異常執行以下代碼 print('程序異常')
運行結果:
程序異常
通過上面可以看到,如果沒有出現異常,它只運行try下的代碼;出現異常,它就運行了except下面的代碼。
如果知道它報的的是ZeroDivisionError異常的話,那可以這樣寫:
try: x = 5 / 0 print(x) except ZeroDivisionError: # 捕獲到ZeroDivisionError的話,執行下面的代碼 print('不能除零') except: # 如果是出現其它錯誤的話,那就執行這里的代碼 print('其它錯誤')
運行結果:
不能除零
如果想看捕獲的異常詳細信息,可以這樣:
try: x = 5 / 0 print(x) except ZeroDivisionError as ze: # 捕獲到ZeroDivisionError的話,執行下面的代碼 print('出現異常',ze)
運行結果:
出現異常 division by zero
四、try...else語句
try: x = 5 / 2 print(x) except ZeroDivisionError: # 捕獲到ZeroDivisionError的話,執行下面的代碼 print('不能除零') except: # 如果是出現其它錯誤的話,那就執行這里的代碼 print('其它錯誤') else: # 如果try執行沒有出現異常的話,就再執行else中的代碼 print('沒有異常')
運行結果:
2.5
沒有異常
else語句是在try語句中的代碼沒有任何異常的情況下,再執行else語句下的代碼。
五、try...finally語句
f = open('data.txt') try: print(f.read()) except: print('文件操作遇到錯誤!') # 這個時候文件始終是打開的,可能后面再讀取的時候就會遇到錯誤,這種情況下我們就適合用finally finally: # 不管上面有沒有出現異常,都要執行finally下的代碼 f.close()
運行結果:
文件操作遇到錯誤!
finally語句就是不管上面有沒有異常,都要執行finally語句下的代碼,通常是做一些必須要釋放的資源的代碼,最典型的就是文件操作和數據庫操作。
六、拋出異常
def method(): raise NotImplementedError('該方法代碼還未實現') # 設定這個函數在這,留個位置,要你寫入代碼,但是可能你沒寫進去,那就設定默認的報錯 method()
運行結果:
Traceback (most recent call last): File "D:/python/lianxi/add.py", line 17, in <module> method() File "D:/python/lianxi/add.py", line 15, in method raise NotImplementedError('該方法代碼還未實現') NotImplementedError: 該方法代碼還未實現
raise語句是拋出一個指定的異常。