如何在不使用try catch块的情况下捕获"throws Exeception"?

Tal*_*lha 2 java design-patterns try-catch

我有一个实现以下接口的基类,在其上声明的方法抛出基本的异常类型Exception.

有很多具体的类扩展了基类,我不想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;
}
Run Code Online (Sandbox Code Playgroud)

基类

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 -----


}
Run Code Online (Sandbox Code Playgroud)

具体类的例子(有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*hes 5

仅仅因为你扩展接口并不意味着你必须添加throws Exception,可以将实现类声明为抛出比接口更少的异常.你不能让实现抛出比接口更广泛的例外.

所以你可以在没有throws子句的情况下定义你的方法,比如:

public Object GetJSONString(HashMap<String,String> params) {
Run Code Online (Sandbox Code Playgroud)

如果抛出任何已检查的异常,您可以将其重新抛出为未经检查的异常.

如果要捕获子类抛出的异常,则必须重新排列代码,以便超类调用子类的方法,否则超类没有机会捕获任何内容.您可能会考虑使用策略是否有意义(这可以让您包含对策略的调用,并可能减少您必须执行的继承量).

发生了很多事情的是开发人员使用继承作为他们首选的扩展手段,并且(因为我们总是匆忙)没有太多关于保持关注点分离的想法,结果是代码复杂且不灵活.在不同的责任范围内打破这一点可能有助于使这不那么复杂,并且可能有助于抛出异常情况,因为不同的部分会更好地集中,并且可能抛出不那么广泛的例外.