[Python] Catch exception 的兩種語法?

[Python] Catch exception 的兩種語法?

這應該算是我學 Python 以來,一個一直有的疑問了,

只是一直沒去把它搞清楚…

平常在 Python 裡 exception 的處理方法是像這樣:

try:
    # Do something...

except IOError as e:
    print "Exception: %s" % (str(e))

 

但在專案程式以及其他的 Python 程式裡,

不乏以下的寫法:

except IOError, e:
    print "Exception: %s" % (str(e))

 

嗯… 看起來有點奇怪,

不過看久也猜的出它跟 exception IOError as e 是等價的。

 

如果我需要抓兩種以上的 exception 時,

第一種寫法會改成:

try:
    # Do something...

except (IOError, OSError) as e:
    print "Exception: %s" % (str(e))

 

但是像 except IOError, e 這種寫法的話,

怎麼知道那個 e 到底是要抓的 exception 類型,

還是抓到的 exception 被指定到的變數呢?

 

今天終於決定去把它查清楚 (到底是有多懶)~

原來 except IOError, e 這種是 Python 2 一開始的語法,

在 Python 2.6 之後,為了減少混淆,

所以出現了 exception IOError as e 的語法,

但舊的語法在 Python 2.x 依然可以用。

只是到了 Python 3.x 之後,就完全只能用 exception IOError as e 的語法了~

 

話說,要是用舊的語法,但想抓兩種 exception 類型的話,

就要寫成:

except (IOError, OSError), e:

 

真的是看起來很奇怪就是了,

也難怪後來會有 PEP 來改掉這種容易搞混的寫法…

 

參考資料:

PEP 3110 — Catching Exceptions in Python 3000 | Python.org

Python try…except comma vs ‘as’ in except – Stack Overflow

python – Catch multiple exceptions in one line (except block) – Stack Overflow

(本頁面已被瀏覽過 947 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料