【问题标题】:Superclass handling subclass exceptions超类处理子类异常
【发布时间】:2014-06-29 15:48:33
【问题描述】:

假设我有一个名为 ApplicationDao 的超类和许多继承的子类,例如 UserDao、ProductDao 等...

如果我的所有子类的 CRUD 方法的 catch 和 finally 块完全相同,那么超类 (ApplicationDao) 是否可以处理异常而不是子类。这意味着我只需要在超类中编写一个 TRY...CATCH...FINALLY 块,而不是在每个子类中复制它。

如果可能的话,我不知道该怎么做,因为每个子类中的方法都有不同的名称(UserDao 中的 getUsers、productDao 中的 getProducts 等),所以我没有直接覆盖超类中的方法。

任何关于如何在父类中为所有子类捕获异常的建议。

【问题讨论】:

  • 能否给我们一个代码

标签: java exception inheritance


【解决方案1】:

首先,不要给方法起不同的名字。接下来,如果您将Superclass 抽象化,并添加一个抽象方法(例如下面的getObjects()),那么您可以在一个地方捕获具体实现中抛出的Exception(s)。此外,你给调用者一个一致的入口点(例如getValues())。 注意:这会使调试变得困难。

public List<T> getValues() {
  try {
    return getObjects();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    System.out.println("In finally");
  }
  return null; // <-- there was an Exception. Default return.
}

protected abstract List<T> getObjects()
    throws Exception;

【讨论】:

    【解决方案2】:

    在 ApplicationDao 中进行通用处理,并让子类调用超类 - 这样您只需为通用内容编写一次代码:

    public class ApplicationDao {
    
        public String process() {
            try{
                // Common processing here
            } catch (Exception e) {
                //...
                return "KO";
            }
            return "OK";
        }
    }
    
    public class UserDao extends ApplicationDao  {
    
        public String getUser() {
            String a = super.process();
            // Specific processing here...
            return "user";
        }
    }
    

    我会让 ApplicationDao 抽象...

    【讨论】:

      【解决方案3】:

      超类不能“处理”子类异常。 子类可以替换/包装超类方法,而不是相反。

      但是,您可以将代码重构为多个部分:

      1. 执行 select 语句等常见功能可能是 移至 executeQuery 之类的方法。
      2. 这可以在基类中使用。子类可以 使用这个基类方法,只需传递适当的 sql 查询 到那个方法。
      3. 在这种情况下,executeQuery 方法可以处理异常,例如 SQLException 并将它们包装到特定于应用程序的未选中 异常(或在可接受的情况下静默处理异常)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        相关资源
        最近更新 更多