Python學習之 異常處理詳解
“你不可能總是對的”
甚至計算機也會有失誤的時候。當然程式設計師也不例外,就算是經驗豐富的碼農,也不能保證寫出來的程式碼百分之百沒有任何問題(要不哪來的那麼多的漏洞)。
程式出現邏輯錯誤或者使用者輸入不合法都會引發異常,但這些一場不是致命的,不會導致程式壞死。可以利用Python提供的異常處理機制,在異常出現的時候及時捕獲,並從內部消化掉。
那麼接下來就是正確學習Python的姿勢了。
那什麼是異常呢?我們先來了解下,如果你編寫了一個異常程式碼,執行後,會出現異常,程式碼會停止,並顯示出一個 Traceback ,這其中就包含了有關異常的報告,舉個例子:
#example1.py
file_name = '不存在的檔案.txt'
f = open(file_name, 'r')
print('輸出檔案內容:')
for line in f:
print(line)
這裡是開啟一個不存在的檔案,那麼這就會使程式碼出現異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example1.py", line 2, in
f = open(file_name, 'r')
FileNotFoundError: [Errno 2] No such file or directory: '隨便來個檔案.txt'
上面的例子就丟擲了一個FileNotFoundError異常。
當然了Python不可能只丟擲這麼一個異常,
那Python通常會丟擲那些異常呢?這裡我先一一列舉出來,做個總結,讓大家先有個認識,這樣今後遇見這樣的異常時就不會感到陌生了。
常見異常總結
1. FileNotFoundError:找不到檔案異常
使用檔案時,一種常見的問題是找不到檔案:你要查詢的檔案可能在其他什麼地方,檔名可能不正確或者這個檔案根本不存在。
上面已舉例,這裡我就不再舉例了。
2. AssertionError:斷言語句(assert)失敗
當 assert 這個我關鍵字後面的條件為假時,程式將停止並丟擲 AssertionError 異常。assert 語句一般是在測試程式的時候用於在程式碼中置入檢查點:
#example2
my_list = ['example2']
assert len(my_list) > 0
my_list.pop()
assert len(my_list) > 0
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 5, in
assert len(my_list) > 0
AssertionError
3. AttributeError:嘗試訪問未知的物件屬性
當試圖訪問的物件屬性不存在時丟擲 AttributeError 異常:
#example3
my_list = []
my_list.example3
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 2, in
my_list.example3
AttributeError: 'list' object has no attribute 'example3'
4. IndexError:索引超出序列範圍
在使用序列的時候就常常會遇到 IndexError 異常,原因是索引超出序列範圍的內容:
#example4
my_list = [1,2,3]
x = my_list[3]
print(x)
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 2, in
x = my_list[3]
IndexError: list index out of range
5. KeyError:字典中查詢一個不存在的關鍵字
當試圖在字典中查詢一個不存在的關鍵字時就會引發 KeyError 異常,因此建議使用 dict.get()方法:
# example5
my_dist = {'one':1, 'two':2, 'three':3}
x = my_dist['one']
print(x)
y = my_dist['four']
print(y)
異常:
1
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 4, in
y = my_dist['four']
KeyError: 'four'
6. NameError:嘗試訪問一個不存在的變數
當嘗試訪問一個不存在的變數時,Python會丟擲 NameError 異常:
#example6
example6
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
example6
NameError: name 'example6' is not defined
7. OSError:作業系統產生的異常
OSError ,顧名思義就是作業系統產生的異常,就像開啟一個不存在的檔案就會引發 FileNotFindError ,而這個 FileNotFindError 就是 OSError 的子類。
例子在上面已演示過了,這裡就不再重說了。
8. SyntaxError:Python 的語法錯誤
如果遇到 SyntaxError 是 Python 的語法錯誤,這時 Python 的程式碼並不能繼續執行,應該先找到並改正錯誤:
#example8
print 'I am example8'
異常:
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1
print 'I am example8'
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('I am example8')?
9. TypeError:不同型別間的無效操作
型別不同的物件是不能互相進行計算的,否則會丟擲 TypeError 異常:
#example9
x = 1 + '1'
print(x)
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
x = 1 + '1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
10. ZeroDivisionError:除數為零
地球人都知道除數不為零,所以除以零就會引發 ZeroDivisionError 異常:
#example10
x = 365 / 0
print(x)
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
x = 365 / 0
ZeroDivisionError: division by zero
現在我們已經講完常見的異常型別了,那接下來就是進入正題,該如何處理異常了
一、 try—except 語句
1. 語法結構:
try:
檢測內容
except Exception [as reason]:
出現異常(Exception)後的處理程式碼
2. 簡單舉個例子:
#example
f = open('不存在的文件.txt')
print(f.read())
f.close()
當上面的例子中’不存在的文件.txt‘,這個文件不存在時,Python就會報錯出現異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
f = open('不存在的文件.txt')
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'
這時為了解決異常問題,我們可以這麼修改程式碼:
try:
f = open('不存在的文件.txt')
print(f.read())
f.close()
except OSError:
print('檔案開啟的時候出錯啦T_T')
執行一下試試:
檔案開啟的時候出錯啦T_T
注:這裡我之所以用 OSError 而沒用 FileNotFindError 是因為導致 OSError 異常的原因有很多(如 FileNotFindError,FileExistsError,PermissionError 等)
當然了,如果你更在意出錯的具體內容,這裡可以用 as 把具體的錯誤資訊給列印出來:
try:
f = open('不存在的文件.txt')
print(f.read())
f.close()
except OSError as reason:
print('檔案開啟的時候出錯啦T_T\n 錯誤原因是:' + str(reason))
執行後,結果為:
檔案開啟的時候出錯啦T_T
錯誤原因是:[Errno 2] No such file or directory: '不存在的文件.txt'
3. 針對不同異常設定多個 except
一個 try 語句可以和多個 except 語句搭配(缺點是它只會返回第一個發現的異常):
#example
try:
x = 1 + '1'
f = open('不存在的文件.txt')
print(f.read())
f.close()
except OSError as reason:
print('檔案開啟的時候出錯啦T_T\n 錯誤原因是:' + str(reason))
except TypeError as reason:
print('型別出錯啦T_T\n 錯誤原因是:' + str(reason))
執行後,結果為:
型別出錯啦T_T
錯誤原因是:unsupported operand type(s) for +: 'int' and 'str'
4. 對多個異常統一處理
except 後面還可以跟著多個異常,然後對這些異常進行統一的處理(同樣缺點是它只會返回第一個發現的異常):
try:
int('abc')
x = 1 + '1'
f = open('不存在的文件.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as reason:
print('出錯啦T_T\n 錯誤原因是:' + str(reason))
執行後,結果為:
出錯啦T_T 鄭州哪個醫院做人流好
錯誤原因是:invalid literal for int() with base 10: 'abc'
5. 捕獲所有異常
如果你無法判斷要對哪一型別的異常進行處理,只是希望在 try 語句中一旦出現異常,可以返回一個看得懂的異常錯誤提醒,那麼可以這麼做:
try:
int('abc')
x = 1 + '1'
f = open('不存在的文件.txt')
print(f.read())
f.close()
except:
print('出錯啦T_T')
執行後,結果為:
出錯啦T_T
注: 不過通常不建議這麼做,因為它會隱藏所有程式未想到並且未做好處理準備的錯誤。
二、 try—finally 語句
如果確定存在一個名為 ’不存在的文件.txt‘ 的檔案,open() 函式正常返回檔案物件,但異常卻發生在成功開啟檔案後的 x = 1 + ’1‘ 語句上。此時 Python 將直接跳到 except 語句上,也就是說,檔案開啟了,但關閉檔案的命令卻被跳過了,導致沒有關閉檔案。
try:
f = open('不存在的文件.txt')
print(f.read())
x = 1 + '1'
f.close()
except:
print('出錯啦T_T')
因此出現了,為了實現像這種”就算出現異常,但也並不的不執行的收尾工作(如在程式崩潰前儲存使用者文件)“,引入了 finally 來擴充套件 try:
try:
f = open('不存在的文件.txt')
print(f.read())
x = 1 + '1'
except:
print('出錯啦T_T')
finally:
f.close()
注:如果 try 語句塊中沒有出現任何異常,會跳過 except 語句塊執行 finally 語句塊的內容。如果出現了異常,則會先執行 except 語句塊的內容再執行 finally 語句塊的內容。總之,finally 語句塊中的內容就是確保無論如何都將被執行的內容。
三、 try—except 擴充套件 (出現異常時一聲不吭)
如果我們想在出現異常時,當作什麼也沒發生,不做任何處理,可以使用 pass 語句來實現。
try:
f = open('不存在的文件.txt')
print(f.read())
except:
pass
執行後,結果為:
Process finished with exit code 0
四、 else 語句搭配
else 語句還能與異常處理進行搭配,實現方法與迴圈語句搭配差不多:只要 try 語句塊裡沒有出現任何異常,那麼就會執行 else 語句塊裡的內容。
try:
int(4.5)
except ValueError as reason:
print('出錯啦T_T: '+ str(reason))
else:
print('沒有任何異常!')
執行後,結果為:
沒有任何異常!
Process finished with exit code 0
五、 簡潔的 with 語句
你們在玩檔案的時候可能都見過 with 語句 ,但是你們都理解為什麼要帶著它嗎?
你們可能覺得,既要開啟檔案又要關閉檔案,還要關注異常處理,有點麻煩,所以 Python 提供了一個 with 語句,利用這個語句抽象出檔案操作中頻繁使用的 try/except/finally 相關的細節。對檔案操作使用 with 語句,將大大減少程式碼量,而且再也不用擔心出現檔案開啟了忘記關閉的問題了 ( with 會自動幫助關閉檔案)。
舉例:
try:
f = open('不存在的文件.txt', 'w')
print(f.read())
except OSError as reason:
print('出錯啦T_T: ' + str(reason))
finally:
f.close()
使用 with 語句 ,可以改成以下這樣:
try:
with open('不存在的文件.txt', 'w') as f:
print(f.read())
except OSError as reason:
print('出錯啦T_T: ' + str(reason))
是不是覺得很方便呢,有了 with 語句,就在也不用擔心忘記關閉檔案了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2685436/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python異常處理詳解Python
- Reactor詳解之:異常處理React
- JAVA學習之異常處理Java
- 【java學習之再遇異常處理】Java
- Python入門學習之異常處理機制Python
- swoft 學習筆記之異常處理筆記
- Python入門學習 之 永久儲存、異常處理Python
- Python的學習(十一)----異常處理(2)Python
- SpringMVC學習系列(10) 之 異常處理SpringMVC
- 詳解C#異常處理C#
- python異常處理之returnPython
- MySQL定義異常和異常處理詳解MySql
- python 基礎之異常處理Python
- C++ 異常處理機制詳解:輕鬆掌握異常處理技巧C++
- rust學習十、異常處理(錯誤處理)Rust
- 異常處理 - Go 學習記錄Go
- Python異常處理Python
- Python——異常處理Python
- Java異常處理之陋習展播 (轉)Java
- 異常處理機制(二)之異常處理與捕獲
- python try異常處理Python
- python異常捕捉處理Python
- 2.1.3 Python物件導向之異常處理Python物件
- Python穩基修煉之異常處理Python
- NodeJS之異常處理NodeJS
- Java學習--異常處理及其應用類Java
- 【跟著我們學Golang】之異常處理Golang
- 重學Java - 異常處理Java
- 解讀Rails – 處理異常AI
- Python之錯誤異常和檔案處理Python
- 異常篇——異常處理
- Python Selenium異常處理Python
- python應用:異常處理Python
- Python 中的異常處理Python
- Python異常處理機制Python
- Python基礎 -- 異常處理Python
- Python錯誤處理和異常處理(二)Python
- Java之異常處理try{}catch(){}Java