iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
AI & Data

時間管理大師-時間序列分析終極密技系列 第 10

[Day10]傳奇萬古-python終極指南:讓你的程式天下無敵,例外處理奧義

語法錯誤和邏輯錯誤是寫程式的人永遠的痛,但些問題並非難解,只要經過測試和偵錯還是能處理的,相較之下,執行錯誤就比較令人頭痛了,因為它可能跟系統環境、外部資源相關,甚是可以牽扯到硬體設備,所以為了更有效的對付這種BUG,我們就要使用例外處理了

例外處理 try...except...

將可能會出錯的程式碼放在try的區塊下,當try的區塊裡面出現錯誤時,就執行except區塊內的程式碼,可想而知,程式錯誤千百種,except區塊預設為只要發生錯誤就執行,當然,except區塊也能設定成只有發生特定的錯誤才執行,這種設定稱為錯誤捕捉,操作方式如下

try:
	程式區塊......
except:
	如果上方程式發生錯誤,則執行此程式區塊

錯誤捕捉的方式為,在except後方加上異常名稱,就可以設定成當發生該異常時在執行except區塊,至於異常名稱有哪些呢?我們可以看一下python標準異常這個東西

異常名稱 描述
BaseException 所有異常的基類
SystemExit 直譯器請求退出
KeyboardInterrupt 使用者中斷執行(通常是輸入^C)
Exception 常規錯誤的基類
StopIteration 迭代器沒有更多的值
GeneratorExit 生成器(generator)發生異常來通知退出
SystemExit Python 直譯器請求退出
StandardError 所有的內建標準異常的基類
ArithmeticError 所有數值計算錯誤的基類
FloatingPointError 浮點計算錯誤
OverflowError 數值運算超出最大限制
ZeroDivisionError 除(或取模)零 (所有資料型別)
AssertionError 斷言語句失敗
AttributeError 物件沒有這個屬性
EOFError 沒有內建輸入,到達EOF 標記
EnvironmentError 作業系統錯誤的基類
IOError 輸入/輸出操作失敗
OSError 作業系統錯誤
WindowsError 系統呼叫失敗
ImportError 匯入模組/物件失敗
KeyboardInterrupt 使用者中斷執行(通常是輸入^C)
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 使用者程式碼生成的警告
操作方式如下
try:
	程式區塊......
except 異常名稱 as 異常名稱別名:
	如果上方程式發生指定的異常,則執行此程式區塊

範例

try:
    # 讀取myfile.ext檔案
	files = open( "./myfile.ext" , mode = "r" , encoding = "utf-8" )
except IOError as e:
    # 如果myfile.ext檔案不存在,就會觸發IO錯誤,執行以下區塊
	print(e)
    print("檔案不存在")

還有捕捉多重錯誤的方式

try:
	程式區塊......
except (異常名稱1,異常名稱2) as 異常名稱別名A:
	如果上方程式發生指定的異常,則執行此程式區塊
except (異常名稱3,異常名稱4) as 異常名稱別名B:
    如果上方程式發生指定的異常,則執行此程式區塊

另外再來題一下try...except...else...finally...敘述,else...finally...並不是絕對必要的敘述,else區塊在try區塊正常的執行完成後會執行,也就是說沒有發生異常才會執行,finally區塊就是無論如何最終一定會執行,操作如下

try:
	程式區塊......
except (異常名稱1,異常名稱2) as 異常名稱別名A:
	如果上方程式發生指定的異常,則執行此程式區塊
except (異常名稱3,異常名稱4) as 異常名稱別名B:
    如果上方程式發生指定的異常,則執行此程式區塊
...如果有需要可以繼續增加except區塊
else:
    try區塊順利執行完畢,沒有發生任何錯誤時執行
finally:
    無論如何最後都會執行

上一篇
[Day9]江湖落拓不知年-python終極指南:基本IO,有進有出,進退皆宜
下一篇
[Day11]日月既往,不可復追-python終極指南:程式開發的新時代,類別與物件
系列文
時間管理大師-時間序列分析終極密技30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言