我有一个实现以下接口(interface)的基类,其上声明的方法抛出基本异常类型Exception
。
有许多具体的类扩展了基类,我不想在所有这些类中添加 try-catch
block 。有没有办法在不添加 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;
}
}
最佳答案
仅仅因为扩展接口(interface)并不意味着必须添加抛出异常
,可以将实现类声明为比接口(interface)抛出更少的异常。您只是不能让实现抛出比接口(interface)更广泛的异常。
因此,您可以在不使用 throws 子句的情况下定义方法,例如:
public Object GetJSONString(HashMap<String,String> params) {
如果抛出任何已检查异常,您可以将其作为未检查异常重新抛出。
如果你想捕获子类抛出的异常,你必须重新安排你的代码,以便子类的方法被父类(super class)调用,否则父类(super class)没有机会捕获任何东西。您可能会考虑使用策略是否有意义(这将允许您包装对策略的调用,并可能减少您必须执行的继承量)。
经常发生的事情是,开发人员使用继承作为他们首选的扩展方式,并且(因为我们总是很匆忙)没有太多考虑将关注点分开,结果是代码变得复杂且不灵活。按照不同的责任线将其分解可能有助于降低复杂性,并且可能有助于解决异常抛出的情况,因为不同的部分会更好地集中,并且可能会抛出不太广泛的异常。
关于java - 如何在不使用 try catch block 的情况下捕获 "throws Exeception"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295682/