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)
仅仅因为你扩展接口并不意味着你必须添加throws Exception,可以将实现类声明为抛出比接口更少的异常.你不能让实现抛出比接口更广泛的例外.
所以你可以在没有throws子句的情况下定义你的方法,比如:
public Object GetJSONString(HashMap<String,String> params) {
Run Code Online (Sandbox Code Playgroud)
如果抛出任何已检查的异常,您可以将其重新抛出为未经检查的异常.
如果要捕获子类抛出的异常,则必须重新排列代码,以便超类调用子类的方法,否则超类没有机会捕获任何内容.您可能会考虑使用策略是否有意义(这可以让您包含对策略的调用,并可能减少您必须执行的继承量).
发生了很多事情的是开发人员使用继承作为他们首选的扩展手段,并且(因为我们总是匆忙)没有太多关于保持关注点分离的想法,结果是代码复杂且不灵活.在不同的责任范围内打破这一点可能有助于使这不那么复杂,并且可能有助于抛出异常情况,因为不同的部分会更好地集中,并且可能抛出不那么广泛的例外.