來處理異常,我得到這個樣層次和類似代碼:將在我的班級層次
class FrontendException:
pass
class BackendException:
pass
class BackendRequest:
def exec():
raise BackendException()
class Frontend:
def cmd_a():
BackendRequest().exec()
def cmd_b():
BackendRequest().exec()
目標是使開發人員能夠功能Frontend
cmd_x
內的Frontend
對象和異常運行。
基本上,我需要一個地方來處理常見的BackendException
類型,以提高FrontendException
。例如:
class Frontend:
def cmd_a():
try:
BackendRequest().exec()
except BackendException as e:
raise FrontendException()
而這會在每個cmd_x
函數中重複出現!這太難看了!它與Backend
東西!我想刪除重複的異常處理。 有什麼建議嗎?
順便說一句,我的解決方案,但我覺得它太醜了,所以查看它後,你會試圖建議我的東西。也許你會爲我提供一些解決方案。
class BaseFrontend:
def exec_request(req):
try:
return req.exec()
except BackendException as e:
raise FrontendException
class Frontend(BaseFrontend):
def cmd_a():
result self.exec_request(BackendRequest())
def cmd_b():
result self.exec_request(BackendRequest())
編輯:好吧,是的,我知道,我不需要創建大量的類來構建簡單的API。但是,讓我們看看有什麼我需要的結果:
class APIManager:
def cmd_a(): ...
def cmd_b(): ...
這位經理需要訪問HTTP REST服務來執行每個命令。所以,如果我在REST請求期間遇到錯誤,那麼我需要引發異常APIManagerException - 我不能不能請假raw pycurl exception
,因爲APIManager用戶不知道pycurl
是什麼,他會被pycurl error
if他將作爲cmd_x
的參數給出錯誤ID
。 所以我需要提出一些常見情況的信息例外。讓它只是一個例外 - APIManagerException
。但我不想每次重複try...except
塊,在每個命令,每個pycurl請求。實際上,我想在commands(functions cmd_x)
中處理一些錯誤,而不是解析pycurl錯誤。
請看看:https://www.youtube.com/watch?v = o9pEzgHorH0#t = 9m26s(Stop Writing Classes,Jack Diederich):簡而言之:嘗試使用內置的異常並小心創建額外的異常;分類法往往只會增加額外的負擔而沒有好處。 – miku
爲什麼你需要將BackendExceptions轉換爲FrontendExceptions?這看起來像Java ... –
是啊,吻,幹 - 我知道,但我建立後端exacly臃腫的API,使人們能夠使用輕,性感的功能。糟糕的是 - 我仍然需要使用後端請求創建一堆函數,我需要處理來自後端的錯誤。 – dt0xff