簡體   English   中英

Python:如何在異常捕獲中避免代碼重復?

[英]Python: how to avoid code duplication in exception catching?

在Python中處理不同的異常類型時,避免代碼重復的好方法是什么,例如。 我想要處理URLError和HTTPError模擬但不完全:

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

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

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

我應該選擇哪一種,還有另一種更好的方法嗎?

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

  • 這是最短的版本
  • 它避免了重復
  • 與第二個版本不同,它易於閱讀並且易於理解。

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

此外,在您的示例中,第一個版本不太正確,因為URLError處理程序已經捕獲HTTPError ,因此永遠不會到達except HTTPError部分except HTTPError部分。 except s except你必須切換兩個。 不使用此的另一個原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM