我正在從python 2.7中打包一個基於XML的遠程API。該API通過發送一個<statusCode>
元素以及一個<statusDescription>
元素來引發錯誤。現在,我抓住了這個條件,並提出了一個單一的異常類型。喜歡的東西:如何基於傳遞給__init__的參數實例化特定的子類?
class ApiError(Exception):
pass
def process_response(response):
if not response.success:
raise ApiError(response.statusDescription)
這工作得很好,但我現在想在一個更復雜的方式來處理錯誤。由於我有statusCode
元素,因此我想根據statusCode提出一個特定的ApiError子類。實際上,我想我的包裝進行擴展這樣的:
class ApiError(Exception):
def __init__(self, description, code):
# How do I change self to be a different type?
if code == 123:
return NotFoundError(description, code)
elif code == 456:
return NotWorkingError(description, code)
class NotFoundError(ApiError):
pass
class NotWorkingError(ApiError):
pass
def process_response(response):
if not response.success:
raise ApiError(response.statusDescription, response.statusCode)
def uses_the_api():
try:
response = call_remote_api()
except NotFoundError, e:
handle_not_found(e)
except NotWorkingError, e:
handle_not_working(e)
的機械捆綁特定statusCode
的具體子類是直接的。但是我想要的是將它埋在ApiError的某處。具體來說,除了傳入值statusCode
之外,我不想更改process_response。
我已經看過元類,但不確定它們是否有助於這種情況,因爲__new__
獲得了寫入時間參數,而不是運行時參數。同樣無用的是在__init__
周圍進行黑客攻擊,因爲它不打算返回實例。那麼,如何基於傳遞給__init__
的參數實例化一個特定的子類呢?
你爲什麼要使用一個類,如果你需要的方法?使用一個函數,根據狀態碼 –
@GabiPurcaru返回不同的實例。好的問題。因爲我不想顯着地改變'process_response'中的'raise ApiError()'行。我感興趣的是如何在不影響現有「提高」聲明的情況下做到這一點。 –