20130714-Python異常處理機制
1、目標
使用異常處理機制
常用異常類
2、Python異常處理機制
2.1、異常處理關鍵字
關鍵字 |
說明 |
形式 |
try |
檢查程式碼塊 |
|
except |
捕捉處理異常 一個try可連續使用多個except 一個except可捕捉多種異常 |
except Exception, e: #處理異常 except (ValueError, TypeErroe), e: #一個except處理多個異常 |
else |
try無異常時執行 |
|
finally |
無論異常與否,必執行 |
|
raise |
觸發丟擲異常 |
raise [SomeException [,args[,traceback]]] #traceback:異常觸發時的跟蹤記錄物件 |
2.2、異常處理流程示例
try: #檢查程式碼塊 except ValueError, e: #處理ValueError except TypeError, e #處理TypeError except Exception, e raise string, “new exception” #丟擲異常 else: #無異常時,執行 finally: #清理垃圾 |
3、常用異常類
3.1、異常類繼承樹
3.2 異常類Exception屬性
3.2.1繼承自BaseException的
屬性 |
說明 |
args |
raise Exception [,args [, traceback]] 中的args,元組型別 raise Exception, (“error message”, errorno) |
message |
Exception(“my message”), “my message” 為message屬性值 注(’my message’,)為args元組 |
方法 |
說明 |
__reduce__ |
__reduce__(self):序列化自身 |
__setstate__ |
當處理unpickling(不可序列化) 的物件的例項屬性時,可以使用特殊的方法 _setstate_() 來修改類例項的狀態。
|
__unicode__ |
解碼為unicode物件 |
裝飾器(slot wrapper) |
說明 |
__init__ |
|
__str__ |
返回可讀字串 |
__repr__ |
representation,返回可解析的字串。它的返回值通常可以用來重新獲得該物件,通常情況下 obj==eval(repr(obj)) |
__setattr__ |
新增(屬性/值)對,__setattr__(self, key, value) 示例見附錄2 |
__delattr__ |
刪除(屬性/值)對,__delattr__ (self, key) |
__getattribute__ |
獲取屬性,__getattr__ (self, key) |
__getitem__ |
迭代args元組 |
__getslice__ |
獲取args元組片段,__getslice__(i,j) = __getitem__(slice(i,j) |
3.2.2繼承自Object
內建方法 |
說明 |
__new__ |
構造方法 |
__subclasshook__ |
__subclasshook__(subclass) 判斷subclass是否為本類的子類 |
方法 |
說明 |
__format__ |
接受一個格式化指示符作為引數,來控制怎樣格式化自己。 __format__(self, format_spec) 示例見附錄3 |
__reduce_ex__ |
__reduce_ex__(self, protocol) 當pickling時被呼叫,如果沒有,則呼叫__reduce__,若也沒有,則此類可以正常pickling |
__sizeof__ |
獲取物件佔用位元組數 |
裝飾器 |
說明 |
__hash__ |
計算物件的hash鍵值 |
3.3異常類列表
異常類 |
描述 |
BaseException |
異常基類 |
SystemExit |
python直譯器請求退出 |
KeyboardInterrupt |
使用者中斷執行(ctl+c) |
Exception |
常規錯誤的基類 |
StopIteration |
迭代器沒有更多值 |
GeneratorExit |
生成器異常請求退出 |
ArithmeticError |
所有數值計算錯誤基類 |
FloatingPointError |
浮點計算錯誤 |
OverflowError |
數值溢位異常 |
ZeroDivisionError |
除以0異常 |
AssertionError |
斷言語句異常 |
AttributeError |
物件沒有這個屬性 |
EOFError |
到達EOF標記 |
EnvironmentError |
作業系統錯誤基類 |
IOError |
輸入輸出操作失敗 |
OSError |
作業系統錯誤 |
WindowsError |
Windows系統呼叫失敗 |
ImportError |
匯入模組/物件失敗 |
KeyboardInterrupt |
使用者中斷執行(ctrl+c) |
LookupError |
無效資料查詢基類 |
IndexError |
序列中沒有此索引 |
KeyError |
對映中沒有此鍵 |
MemoryError |
記憶體溢位 |
NameError |
未宣告/未初始化物件 |
UnboundLocalError |
訪問未初始化本地變數 |
ReferenceError |
弱引用訪問已回收物件錯誤 |
RuntimeError |
一般執行時錯誤 |
NotImplementatedError |
尚未實現的方法 |
SystemError |
一般的直譯器系統錯誤 |
IndentationError |
縮排錯誤 |
TabError |
Tab和空格混用 |
SyntaxError |
python語法錯誤 |
TypeError |
對型別無效的操作 |
ValueError |
傳入無效的引數 |
UnicodeError |
Unicode相關錯誤 |
UnicodeDecodeError |
Unicode解碼錯誤 |
UnicodeEncodeError |
Unicode編碼錯誤 |
UnicodeTranslatError |
Unicode轉換錯誤 |
Warning |
警告的基類 |
DeprecationWarning |
關於被棄用特徵的警告 |
FutureWarning |
構造將來語義會有改變的警告 |
OverflowWarning |
自動提升長整型警告 2.4棄用 |
PendingDeprecationWarning |
特性將被棄用的警告 |
RuntimeWarning |
可疑的執行時行為的警告 |
SyntaxWarning |
可疑語法的警告 |
UserWarning |
使用者程式碼生成警告 |
附錄:
1、__setstate__ : 修改Foo物件的狀態(修改開啟的檔案,和寫入位置)
class Foo(object): def __init__(self, value, filename): self.value = value self.logfile = file(filename, 'w') def __getstate__(self): """Return state values to be pickled.""" f = self.logfile return (self.value, f.name, f.tell()) def __setstate__(self, state): """Restore state from the unpickled state values.""" self.value, name, position = state f = file(name, 'w') f.seek(position) self.logfile = f |
2、__setattr__,__delattr__, __getattr__
class storage(dict): |
3、__format__()
def __format__(self, format_spec): |