2014-06-29 84 views
0

比方說,我有一個名爲ApplicationDao超和一些繼承子類,如userDAO的,ProductDao的等......超類的子類處理異常

如果我的漁獲物和finally塊正是我所有的子類CRUD相同方法,超類(ApplicationDao)可以處理異常而不是子類。這意味着我只需要寫一個TRY ... CATCH ... FINALLY在超類中阻塞,而不是在每個子類中複製它。

如果可能,我不知道該怎麼做,因爲每個子類中的方法都會有不同的名稱(UserDao中的getUsers,productDao中的getProducts等),所以我並不直接重寫超類中的方法。

對於如何在所有子類的父類中捕獲異常的任何建議讚賞。

+0

你能否提供我們的代碼? – CMPS

回答

1

首先,不要給方法不同的名稱。接下來,如果您製作抽象的Superclass,並添加一個抽象方法(例如,下面的getObjects()),那麼您可以在一個地方捕獲在具體實現中拋出的Exception(s)。此外,您還爲呼叫者提供了一個一致的入口點(例如getValues())。 注意:這可能會使調試變得困難。

public List<T> getValues() { 
    try { 
    return getObjects(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } finally { 
    System.out.println("In finally"); 
    } 
    return null; // <-- there was an Exception. Default return. 
} 

protected abstract List<T> getObjects() 
    throws Exception; 
0

超類無法「處理」子類異常。 子類可以替換/包裝超類方法,而不是相反。

但是,你可以重構你的代碼成片:

  1. 像執行SELECT語句可能是 常見的功能轉移到像的executeQuery方法。
  2. 這可以在基類中提供。子類 使用此基類方法,只是將適當的sql查詢 傳遞給該方法。
  3. 在這種情況下,executeQuery方法可以處理異常,如 SQLException,並將它們封裝到特定於應用程序的未經檢查的 異常(或者在可以接受的情況下靜默處理異常)。
0

有您共同處理ApplicationDao並調用子類的超類 - 這種方式,你只寫了共同的東西,一旦代碼:

public class ApplicationDao { 

    public String process() { 
     try{ 
      // Common processing here 
     } catch (Exception e) { 
      //... 
      return "KO"; 
     } 
     return "OK"; 
    } 
} 

public class UserDao extends ApplicationDao { 

    public String getUser() { 
     String a = super.process(); 
     // Specific processing here... 
     return "user"; 
    } 
} 

我會讓ApplicationDao抽象...