python異常之with


1、基本語法
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部分的異常
2、原理:
(1)__enter__和__exit__:
with不管什么情況都會執行這兩個方法,所以使用with處理的對象必須有__enter__()和__exit__()
其中__enter__()方法在語句體(with語句包裹起來的代碼塊)執行之前進入運行,__exit__()方法在語句體執行完畢退出后運行。
(2)with語句的工作原理:
緊跟with后面的語句會被求值,返回對象的__enter__()方法被調用,這個方
法的返回值將被賦值給as關鍵字后面的變量,當with后面的代碼塊全部被執
行完之后,將調用前面返回對象的__exit__()方法。
(3)with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。
因為上下文管理器主要作用於共享資源,你可以想象到__enter()__和__exit()__方法基本是干的需要分配和釋放資源的低層次工作,比如:數據庫連接,鎖分配,信號量加減,狀態管理,打開/關閉文件,異常處理,等等.
3、自定義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')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM