2011-10-10 76 views
9

在Python中處理不同的異常類型時,避免代碼重複的好方法是什麼,例如。我要治療URLError和HTTPError simlar但不完全:Python:如何避免異常捕獲中的代碼重複?

try: 
    page = urlopen(request) 
except URLError, err: 
    logger.error("An error ocurred %s", err) 
except HTTPError, err: 
    logger.error("An error occured %s", err) 
    logger.error("Error message: %s", err.read()) 

在這個例子中,我想,以避免第一logger.error呼叫的重複。鑑於URLError是HTTPError的父親可以做這樣的事情:

except URLError, err: 
    logger.error("An error occurred %s", err) 
    try: 
     raise err 
    except HTTPError, err: 
     # specialization for http errors 
     logger.error("Error message: %s", err.read()) 
    except: 
     pass 

另一種方法是使用isinstance例如。如果URLError和HTTPError不會在繼承鏈:

except (URLError, HTTPError), err: 
    logger.error("An error occured %s", err) 
    if isinstance(err, HTTPError): 
     logger.error("Error message: %s", err.read()) 

哪一個我喜歡,有沒有其他更好的辦法?

回答

10

我認爲你的第三個例子是最好的解決方案。

  • 這是最短的版本
  • 它避免重複
  • 顯然閱讀和易於理解,很多不同的是第二個版本。

但是,如果您使用Python 2.6或更高版本,則可能需要使用較新的except FooError as err語法。

另外,在您的示例中,第一個版本並不完全正確,因爲URLError處理程序已經捕獲了HTTPError,所以except HTTPError零件從未到達過。你必須切換兩個except。另一個不使用此的原因。

+0

謝謝Tim!這是令人信服的。很棒的是你在第一個例子中發現了URErrror,HTTPError排序。我不會編輯這個問題,因爲它清楚地指出了您在答案中提到的那個例子的問題。 – Bernhard