2011-01-29 60 views
10

在Python中,try語句支持else子句,如果try塊中的代碼不引發異常,則執行該子句。例如:爲什麼python中的try語句需要else子句?

try: 
    f = open('foo', 'r') 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 
else: 
    data = f.read() 
    f.close() 

爲什麼需要else子句?我們不能寫上面的代碼如下:

try: 
    f = open('foo', 'r') 
    data = f.read() 
    f.close() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

不會執行繼續data = f.read()如果開不引發異常?

回答

14

不同之處在於,如果在f.read()或f.close()代碼中出現錯誤,會發生什麼情況。在這種情況下:

try: 
    f = open('foo', 'r') 
    data = f.read() 
    f.close() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

在這種情況下f.read()f.close()錯誤會給你的日誌信息"Unable to open foo",這顯然是錯誤的。

在這種情況下,這是避免:

try: 
    f = open('foo', 'r') 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 
else: 
    data = f.read() 
    f.close() 

而且在讀或關閉錯誤不會導致日誌寫入,但錯誤將上升uncatched向上調用堆棧。

+1

謝謝Lennart。這很清楚! :)。那麼,爲什麼我們不會在其他語言(如說Java)中看到else子句呢? :) – John 2011-01-29 10:01:48

2

根據我的理解,else子句用於將try塊的範圍限制爲您試圖管理異常的代碼。或者,您的try區塊較大,您可能會發現您無意捕捉的異常。

3

else用於代碼必須如果try條款引發異常執行。

使用else比額外try條款更好,因爲else可以避免不小心抓,這不是由try except聲明保護的代碼引發異常。

0

@John:
我覺得在諸如Java或其他語言的語言中,您有不同的例外。例如,像FileNotFound異常(或類似的東西,我不知道名稱)。
這樣你可以處理不同的例外,並採取相應的行動。然後你知道爲什麼錯誤發生了,因爲打開或關閉。

相關問題