1. 程式人生 > >20130714-Python異常處理機制

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(不可序列化) 的物件的例項屬性時,可以使用特殊的方法_getstate_()

 和 _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):
   
#通過使用__setattr__, __getattr__, __delattr__
   
#可以重寫dict,使之通過“.”呼叫def__setattr__(self, key, value):
       
self[key] = value
   
def __getattr__ (self, key):
       
try:
           
return self[key]
       
except KeyError, k:
           
return None
   
def __delattr__ (self, key):
       
try:
           
del self[key]
       
except KeyError, k:
           
return None

3、__format__()

def __format__(self, format_spec):
 if isinstance(format_spec, unicode):
  return unicode(str(self))
 else:
  return str(self)