python異常之with

一、基本語法
with expression [as target]:
with_body
參數說明:
expression:是一個須要執行的表達式;
target:是一個變量或者元組,存儲的是expression表達式執行返回的結果,可選參數。
eg:
with open('d:\\tmp:\\test1.txt','r') as fp:
      pass
with僅能工做於支持上下文管理協議(context managementprotocol)的對象
支持這種協議的有:
􀁺 file
􀁺 decimal.Context
􀁺 thread.LockType
􀁺 threading.Lock
􀁺 threading.RLock
􀁺 threading.Condition
􀁺 threading.Semaph
ore
􀁺 threading.BoundedSemaphore
open()中產生的異常不能捕獲
with只能捕獲pass部分的異常
二、原理:
(1)__enter__和__exit__:
with無論什麼狀況都會執行這兩個方法,因此使用with處理的對象必須有__enter__()和__exit__()
其中__enter__()方法在語句體(with語句包裹起來的代碼塊)執行以前進入運行,__exit__()方法在語句體執行完畢退出後運行。
(2)with語句的工做原理:
緊跟with後面的語句會被求值,返回對象的__enter__()方法被調用,這個方
法的返回值將被賦值給as關鍵字後面的變量,當with後面的代碼塊所有被執
行完以後,將調用前面返回對象的__exit__()方法。
(3)with 語句適用於對資源進行訪問的場合,確保無論使用過程當中是否發生異常都會執行必要的「清理」操做,釋放資源,好比文件使用後自動關閉、線程中鎖的自動獲取和釋放等。
由於上下文管理器主要做用於共享資源,你能夠想象到__enter()__和__exit()__方法基本是乾的須要分配和釋放資源的低層次工做,好比:數據庫鏈接,鎖分配,信號量加減,狀態管理,打開/關閉文件,異常處理,等等.
三、自定義with異常
class opened(object):
    def __init__(self,fileName):
        self.handle=open(fileName)
    def __enter__(self):
        print 'enter method'
        return self.handle
    def __exit__(self, exc_type, exc_val, exc_tb):
# 異常的類型,異常的值,異常的堆棧信息
if exc_tb is None:
    print 'No Exception'
    self.handle.close()
else:
    print 'type',exc_type
    print 'value',exc_val
    print 'tb',exc_tb
    self.handle.close()
    return False
 
with opened('d:\\tmp\\test1.txt') as fp:
for line in fp.readline():
    print line
raise Exception('bad input')
相關文章
相關標籤/搜索