Python_Exception例外異常處理_with語法使用教學介紹

在寫任何程式過程中難免會出現一些例外 (異常)

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尚未實現的方法
SyntaxErrorPython 語法錯誤
IndentationError縮進錯誤
TabErrorTab 和空格混用
SystemError一般的解釋器系統錯誤
TypeError對類型無效的操作
ValueError傳入無效的參數
UnicodeErrorUnicode 相關的錯誤
UnicodeDecodeErrorUnicode 解碼時的錯誤
UnicodeEncodeErrorUnicode 編碼時錯誤
UnicodeTranslateErrorUnicode 轉換時錯誤
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








留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header