為什麼,既然 try except 已經是抓到問題了,為什麼還要 raise,把它丟出去呢?
在 python 裡,對於有可能錯誤的地方,就是用 try 去包住它,然後針對可能的錯誤去處理它。像是:
try:
f = open('x','r')
except IOError:
raise
except Exception:
print 'other error'
raise
有天某個人問我,為什麼,既然已經是抓到問題了,為什麼還要 raise,把它丟出去呢?也許有很多理由,但我有兩個簡單的理由:(1)我想直接讓程式被停掉,(2)我想讓執行我寫的程式的程式也知道有問題,讓它自己決定該怎麼辦。這在寫程式給別的程式用的時候很重要。
在 raise exception 的時候,我以前是寫成以下這樣:
try:
f = open('x','r')
except Exception, ex:
print 'other error'
raise ex
這樣在文句上好像很正常,但是就會出現困擾的地方,就是 traceback 所指的 exception 行號是在 raise 的地上,而不是真正發生的地方。
IOError Traceback (most recent call last)
<ipython-input-4-b38801326cd7> in <module>()
3 except Exception, ex:
4 print 'other error'
----> 5 raise exIOError: [Errno 2] No such file or directory: 'x'
後來才發現,應該直接 raise 後面不加參數,才會如下指到對的行數去。
IOError Traceback (most recent call last)
<ipython-input-5-97b21189317b> in <module>()
1 try:
----> 2 f = open('x','r')
3 except IOError:
4 raise
5 except Exception:IOError: [Errno 2] No such file or directory: 'x'