2013-03-08 68 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