2013-03-08 69 views
2

我有一個實現以下接口的基類,其上聲明的方法拋出基本異常類型Exception如何在不使用try catch塊的情況下捕捉「拋出Exeception」?

有很多擴展基類的具體類和我不想在其中添加try-catch。有沒有辦法處理throws而不添加try-catch

接口

public interface IReportFactory { 
    public Object GetDataFromDB(Connection conn,HashMap<String,String> map) throws Exception;   
    public Object GetJSONString(HashMap<String,String> map) throws Exception; 
} 

基類

public abstract class BaseReport implements IReportFactory{   
    public Connection conn; 
    public String acctId = FactoryReport.getAcctId(); 


    ------ I WANT TO CATCH EXCEPTION HERE ------ 
    ------ WHICH ACCURS IN OTHER CLASSES WHICH EXTENDS FROM THIS CLASSES ----- 


} 

的具體類的實施例(有30)

public class GeneralRevenue extends BaseReport { 
    private final Logger logger = Logger.getLogger(GeneralRevenue.class); 

    public GeneralRevenue(Connection _conn) { 
     this.conn = _conn; 
    } 

    @Override 
    public Object GetJSONString(HashMap<String,String> params) throws Exception { 

     //codes 
     return jObj.toString(); 
    } 

    @Override 
    public Object GetDataFromDB(Connection conn,HashMap params) throws Exception { 

     //codes 
     return RevenueList; 
    } 
} 

回答

5

僅僅因爲你在擴展接口並不意味着你必須添加throws Exception,所以可以將你的實現類聲明爲拋出比接口少的異常。你不能讓實現拋出比接口更廣泛的異常。

所以,你可以定義你的方法沒有throws子句,如:

public Object GetJSONString(HashMap<String,String> params) { 

,如果有任何檢查拋出的異常可以重新拋出它作爲一個未經檢查的異常。

如果你想捕獲子類拋出的異常,你必須重新排列你的代碼,以便子類的方法被超類調用,否則超類沒有機會捕捉任何東西。你可能會考慮使用策略是否有意義(這會讓你將調用包裝到策略中,並可能減少繼承的數量)。

發生的事情很多是開發人員使用繼承作爲他們的首選擴展方法,並且(因爲我們總是很急),關於保持關注點分離並沒有太多的想法,結果是代碼很複雜並且不靈活。根據不同的責任劃分,可能會有助於減少這種複雜性,並可能有助於處理異常情況,因爲不同的部分可能會更好地關注並可能引發較少的例外。

+0

此代碼在我之前已經寫入,並且全部concreate類方法的有拋出異常。有沒有辦法處理基類中的所有異常,而不添加try catch所有concreate類的方法?例如,我可以在基類中捕獲concreate類中遇到的異常嗎? – Talha 2013-03-08 14:24:04

+0

所有的類方法都必須拋出異常,但我應該在基類中處理它們。我在問這個問題,我希望我能解釋我的問題 – Talha 2013-03-08 14:27:20

+0

@talhakosen:是的,你可以在具體課程中找到任何內容並在那裏處理。你不需要扔任何東西。 – 2013-03-08 14:28:51

0

爲什麼不創建自定義RuntimeException並將其放入基類的try catch塊中?

public class GeneralRevenue extends BaseReport { 
private final Logger logger = Logger.getLogger(GeneralRevenue.class); 


public GeneralRevenue(Connection _conn) { 
    this.conn = _conn; 
} 

@Override 
public Object GetJSONString(HashMap<String,String> params) throws MyException { 
    try{ 
    //codes 
    }catch(Exception e) { 
    throw new MyException(); 
    } 


    return jObj.toString(); 
} 
} 

class MyException extends RuntimeException { 
} 
0

如果拋出的RuntimeException那麼就沒有必要添加拋出聲明。所以對於您實例創建自己的RuntimeException像

class NewException extends RuntimeException{ 

    } 

然後,當您添加的RuntimeException到您的BaseClass的所有其他方法都不必申報拋出,這將調用這些方法。

http://docs.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html