在網上看到一些人部落格使用 with 用於異常處理,但是我在網仔細查閱,發現
該關鍵字不是用於處理異常的。
實際上,在with後面的**塊丟擲異常時,exit()方法被執行。開發庫時,清理資源,關閉檔案等操作,都可以放在exit()方法中。
總之,with-as表示式極大的簡化了每次寫finally的工作,這對**的優雅性是有極大幫助的。
如果有多項,可以這樣寫:
with open
('1.txt'
)as f1,
open
('2.txt'
)as f2:
do something
說道with 就不得不說道 __enter__ 和 __exit__
簡單來說 __enter__ 是在with 呼叫時執行(就如__init__ 優先執行)
而__exit__ (有點類似於__del__ 後執行銷毀操作) 當然你可以自定義
因為套路過於固定,不是很適合由於異常處理。
如果沒有with語句,則可能會寫以下內容:
如果不用with語句,**如下:
file
=open
("/tmp/foo.txt"
)data =
file
.read(
)file
.close(
)
這裡有兩個煩人的事情。首先,您最終忘記關閉檔案處理程式。第二個是如何處理一旦獲得檔案處理程式可能發生的異常。可以這樣寫來解決這個問題:
這裡有兩個問題。一是可能忘記關閉檔案控制代碼;二是檔案讀取資料發生異常,沒有進行任何處理。下面是處理異常的加強版本:
file
=open
("/tmp/foo.txt"
)try
: data =
file
.read(
)finally
:file
.close(
)
雖然這很好用,但它不必要地冗長。這是with有用的地方。除了更好的語法外,關於它的好處是,它是非常好的處理異常的方法。當與以下**一起使用時,上面的**將如下所示:
有時就是使用一展身手的時候了。除了有更優雅的語法,用還可以很好的處理周圍環境產生的異常。下面是用版本的**:
with
open
("/tmp /foo.txt")as
file
: data =
file
.read(
)
class
sample
:def
__enter__
(self)
:print
"in __enter__()"
return
"foo"
def__exit__
(self,
type
, value, trace)
:print
"in __exit__()"
defget_sample()
:return sample(
)with get_sample(
)as sample:
print
"sample:"
, sample
執行後,將導致:
bash-
3.2$ .
/with_example01.py
in __enter__(
)sample: foo
in __exit__(
)
如您所見,執行__enter __()函式返回的值-在這種情況下,將「 foo」分配給sample執行該塊的主體,從而列印出sample的值。「 foo」呼叫__exit __()函式。真正強大的功能在於它可以處理異常。您可能已經注意到sample的__exit __()函式帶有三個引數-val,type和trace。這些在異常處理中很有用。讓我們通過修改上面的示例來了解其工作原理。
如果要使用捕獲異常可以使用:
try
:print
("執行11"
) num#未下定義變數
print
("執行22"
)except
:print
("try發生異常時執行"
)finally
:print
("無論有無發生異常都會執行"
)
輸出結果:
>>>runfile(『e:/pythonnew/test.py』, wdir=『e:/pythonnew』)
執行11
try發生異常時執行
無論有無發生異常都會執行
總結開發庫時,清理資源,關閉檔案等操作,都可以放在exit()方法中。
比較詳細處理異常時沒使用 try except finally
python with用法詳解
coding utf8 def except try try print start raise keyerror raise indexerror return 1 except keyerror print key error 異常時執行 return 2 else print other er...
Python with用法 自動關閉檔案原理
with語句的語法,ontext expression 用於建立可自動關閉的資源。with context expression as target s with 塊 使用with 開啟檔案並讀取檔案資料 with open test.yml encoding utf 8 as f print f,...
關於的用法
1.訪問action值棧中的普通屬性 2.訪問action值棧中的物件屬性 要有get set方法 3.訪問值棧中物件屬性的方法 4.訪問值棧中action的普通方法 5.訪問靜態方法 6.訪問靜態屬性 配置屬性檔案,允許ognl訪問靜態方法struts.ognl.allow.true 7.訪問ma...