2012-12-19 23 views
0

來處理異常,我得到這個樣層次和類似代碼:將在我的班級層次

class FrontendException: 
    pass  
class BackendException: 
    pass 
class BackendRequest: 
    def exec(): 
     raise BackendException() 

class Frontend: 
    def cmd_a(): 
     BackendRequest().exec() 

    def cmd_b(): 
     BackendRequest().exec() 

目標是使開發人員能夠功能Frontendcmd_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錯誤。

+2

請看看:https://www.youtube.com/watch?v = o9pEzgHorH0#t = 9m26s(Stop Writing Classes,Jack Diederich):簡而言之:嘗試使用內置的異常並小心創建額外的異常;分類法往往只會增加額外的負擔而沒有好處。 – miku

+1

爲什麼你需要將BackendExceptions轉換爲FrontendExceptions?這看起來像Java ... –

+0

是啊,吻,幹 - 我知道,但我建立後端exacly臃腫的API,使人們能夠使用輕,性感的功能。糟糕的是 - 我仍然需要使用後端請求創建一堆函數,我需要處理來自後端的錯誤。 – dt0xff

回答

0

您可以創建一個包裝所有前端調用的裝飾器,捕獲BackendExceptions,並在引發時引發FrontendException。 (老實說,雖然,目前還不清楚爲什麼FrontendBackend是類,而不是一組函數。)請參見下面:

class FrontendException: 
    pass  
class BackendException: 
    pass 
class BackendRequest: 
    def exec(): 
     raise BackendException() 

class Frontend: 

    def back_raiser(func): 
     def wrapped(*args, **kwargs): 
      try: 
       func(*args, **kwargs) 
      except BackendException: 
       raise FrontendException 
     return wrapped 

    @back_raiser 
    def cmd_a(): 
     BackendRequest().exec() 

    @back_raiser 
    def cmd_b(): 
     BackendRequest().exec() 
+0

這可能是一個好主意,但我想處理'cmd_a'中的一些異常。但在這種情況下,我不能。 – dt0xff