2016年6月15日 星期三

[python] try except raise,為什麼會需要 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)
 in ()
      3 except Exception, ex:
      4     print 'other error'
----> 5     raise ex

IOError: [Errno 2] No such file or directory: 'x'
後來才發現,應該直接 raise 後面不加參數,才會如下指到對的行數去。

IOError                                   Traceback (most recent call last)
 in ()
      1 try:
----> 2     f = open('x','r')
      3 except IOError:
      4     raise
      5 except Exception:

IOError: [Errno 2] No such file or directory: 'x'

沒有留言:

張貼留言