Python_Exception例外異常處理_with語法使用教學介紹
在寫任何程式過程中難免會出現一些例外 (異常)
python 也是如此
為此python提供了 Exception 解決的語法方案
讓我們先來簡單示範一下讀取一個文字檔案中的內容
先準備一個文字檔案
內容中有
取名為read.txt
然後放在桌面 和 C槽
寫一個簡單的 openfile的python程式
再輸入路徑之後
你感覺程式運行都很正常
但是一般用戶可能會忽略
.txt副檔名
就會出現這個異常
FileNotFoundError的異常錯誤
這是一個系統子類之異常
Python常見的異常 (摘錄自:http://www.runoob.com/python/python-exceptions.html)
比方 AssertionError 斷言的異常
Assert 語法
主要是在程式碼中某個階段去做測試
比方創建了一個包含六個字元的列表
assert斷言語句 判斷 長度是否大於0 (列表當中是否還有資料)
沒問題就不畏打印出異常
當 pop 出來 列表被清空之後
就報錯了
我們在舉個例子
以 AttributeError為例
假設我們現在針對 myList 列表
去呼叫當中的某個屬性
但是故意去呼叫根本不存在虛構的成員屬性的話
比方 myList.apple
在介紹一個異常
超過序列範圍的 IndexError
在此序列範圍
Index 從0~2
共3個
當呼叫 Index為3則代表超過序列範圍
有這麼多異常那當然需要去檢測這些異常
try ..... except 語法
try:
檢測範圍
except Exception [as reason]:
發生異常後的處理程式碼
藉此引用try ...except語句 偵測異常並給予用戶人性化回應
PS: python 3 之後 已經將python2的 IOError合併整合至 OSError中了
诶 可是你說這個 OSError 可能有很多種原因
不一定真的就是你說的 你指定的 沒有檔案
若要更加具體又明顯
讓程式告訴我們(程式人員)
細節錯誤 或 真正的錯誤緣由
那就必須再補加上 as reason
一個try語句是可以擴充不只一個except語句的喔!!!!
try ..... except ... except ...語法
try:
檢測範圍
except Exception [as reason]:
發生異常後的處理程式碼
except Exception [as reason]:
發生異常後的處理程式碼
except Exception [as reason]:
發生異常後的處理程式碼
.......
我們來舉個範例
假設我程式這樣寫
這一段四行的程式碼總共淺藏著兩個異常
那如果說 在try區塊的程式中
裏頭出現之異常並未包含在後頭跟著的兩個 except 中的話
那會直接跳過後頭兩個 except 語法區塊
並又出現紅色的 Traceback 錯誤警告
ValueError
try 語句檢測範圍區塊一旦出現了異常
那剩餘後頭的語句就不會被執行
會根據當前異常出現處跳至指定except區塊做打印
那若要縮短程式長度
可以同時去做 OSError 及 TypeError兩個錯誤之偵測
try ..... except .....finally 語法
try:
檢測範圍
except Exception [as reason]:
發生異常後的處理程式碼
finally:
無論如何都會被執行的程式碼
使用時機
如果說異常發生在文件成功打開之後
但是python又跳至except語句 (try語句當中的 fclose 並未被執行)
假設我們有作些文件寫入的功能
那這些資料就不會保存到文件之中
而是存在緩衝區內
假設我現在在我專案所在目錄確實新增此文件
read.txt
python 也是如此
為此python提供了 Exception 解決的語法方案
讓我們先來簡單示範一下讀取一個文字檔案中的內容
先準備一個文字檔案
內容中有
取名為read.txt
然後放在桌面 和 C槽
寫一個簡單的 openfile的python程式
再輸入路徑之後
你感覺程式運行都很正常
但是一般用戶可能會忽略
.txt副檔名
就會出現這個異常
FileNotFoundError的異常錯誤
這是一個系統子類之異常
Python常見的異常 (摘錄自:http://www.runoob.com/python/python-exceptions.html)
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 解釋器請求退出 |
KeyboardInterrupt | 用戶中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError | 所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取mode)零(所有數據類型) |
AssertionError | 斷言語句失敗 |
AttributeError | 對像沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 操作系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 操作系統錯誤 |
WindowsError | 系統調用失敗 |
ImportError | 導入模塊/對象失敗 |
LookupError | 無效數據查詢的基類 |
IndexError | 序列中沒有此索引(index) |
KeyError | 映射中沒有這個鍵 |
MemoryError | 內存溢出錯誤(對於Python 解釋器不是致命的) |
NameError | 未聲明/初始化對象(沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變量 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 |
RuntimeError | 一般的運行時錯誤 |
NotImplementedError | 尚未實現的方法 |
SyntaxError | Python 語法錯誤 |
IndentationError | 縮進錯誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的解釋器系統錯誤 |
TypeError | 對類型無效的操作 |
ValueError | 傳入無效的參數 |
UnicodeError | Unicode 相關的錯誤 |
UnicodeDecodeError | Unicode 解碼時的錯誤 |
UnicodeEncodeError | Unicode 編碼時錯誤 |
UnicodeTranslateError | Unicode 轉換時錯誤 |
Warning | 警告的基類 |
DeprecationWarning | 關於被棄用的特徵的警告 |
FutureWarning | 關於構造將來語義會有改變的警告 |
OverflowWarning | 舊的關於自動提升為長整型(long)的警告 |
PendingDeprecationWarning | 關於特性將會被廢棄的警告 |
RuntimeWarning | 可疑的運行時行為(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 用戶代碼生成的警告 |
比方 AssertionError 斷言的異常
Assert 語法
主要是在程式碼中某個階段去做測試
比方創建了一個包含六個字元的列表
assert斷言語句 判斷 長度是否大於0 (列表當中是否還有資料)
沒問題就不畏打印出異常
當 pop 出來 列表被清空之後
就報錯了
我們在舉個例子
以 AttributeError為例
假設我們現在針對 myList 列表
去呼叫當中的某個屬性
但是故意去呼叫根本不存在虛構的成員屬性的話
比方 myList.apple
在介紹一個異常
超過序列範圍的 IndexError
在此序列範圍
Index 從0~2
共3個
當呼叫 Index為3則代表超過序列範圍
有這麼多異常那當然需要去檢測這些異常
try ..... except 語法
try:
檢測範圍
except Exception [as reason]:
發生異常後的處理程式碼
f = open('我是文件.txt') print(f.read()) f.close()
藉此引用try ...except語句 偵測異常並給予用戶人性化回應
try: f = open('我是文件.txt') print(f.read()) f.close() except OSError: print('你這傻逼T_T沒這檔案啦!!!')
PS: python 3 之後 已經將python2的 IOError合併整合至 OSError中了
诶 可是你說這個 OSError 可能有很多種原因
不一定真的就是你說的 你指定的 沒有檔案
若要更加具體又明顯
讓程式告訴我們(程式人員)
細節錯誤 或 真正的錯誤緣由
那就必須再補加上 as reason
try: f = open('我是文件.txt') print(f.read()) f.close() except OSError as reason: print('有錯誤!!錯誤原因為:' + str(reason))
一個try語句是可以擴充不只一個except語句的喔!!!!
try ..... except ... except ...語法
try:
檢測範圍
except Exception [as reason]:
發生異常後的處理程式碼
except Exception [as reason]:
發生異常後的處理程式碼
except Exception [as reason]:
發生異常後的處理程式碼
.......
我們來舉個範例
假設我程式這樣寫
這一段四行的程式碼總共淺藏著兩個異常
sum = 1 + '1' #明顯會出現typeError f = open('我是文件.txt') #明顯會出現FileNotFoundError print(f.read()) f.close()
經過改寫後的擴充except語句
try: sum = 1 + '1' #明顯會出現typeError f = open('我是文件.txt') #明顯會出現FileNotFoundError print(f.read()) f.close() except OSError as reason: print('文件有錯誤!!錯誤原因為:' + str(reason)) except TypeError as reason: print('型態錯誤!!錯誤原因為:' + str(reason))
那如果說 在try區塊的程式中
裏頭出現之異常並未包含在後頭跟著的兩個 except 中的話
那會直接跳過後頭兩個 except 語法區塊
並又出現紅色的 Traceback 錯誤警告
ValueError
try 語句檢測範圍區塊一旦出現了異常
那剩餘後頭的語句就不會被執行
會根據當前異常出現處跳至指定except區塊做打印
那若要縮短程式長度
可以同時去做 OSError 及 TypeError兩個錯誤之偵測
try: sum = 1 + '1' #明顯會出現typeError f = open('我是文件.txt') #明顯會出現FileNotFoundError print(f.read()) f.close() except (OSError,TypeError): print('文件有錯誤!!錯誤原因為:') print('型態錯誤!!錯誤原因為:')
try ..... except .....finally 語法
try:
檢測範圍
except Exception [as reason]:
發生異常後的處理程式碼
finally:
無論如何都會被執行的程式碼
使用時機
如果說異常發生在文件成功打開之後
但是python又跳至except語句 (try語句當中的 fclose 並未被執行)
假設我們有作些文件寫入的功能
那這些資料就不會保存到文件之中
而是存在緩衝區內
假設我現在在我專案所在目錄確實新增此文件
read.txt
留言
張貼留言