超类处理子类异常

时间:2014-06-29 15:48:34

标签: java exception inheritance

让我们说我有一个名为ApplicationDao的超类和一些继承子类,如UserDao,ProductDao等......

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

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

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

3 个答案:

答案 0 :(得分:1)

首先,不要给方法赋予不同的名称。接下来,如果您创建Superclass摘要,并添加一个抽象方法(例如下面的getObjects()),那么您可以在一个地方捕获具体实现中抛出的Exception。此外,您为呼叫者提供一个一致的入口点(例如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;

答案 1 :(得分:1)

在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抽象化......

答案 2 :(得分:0)

超级班不能处理&#39;子类例外。 子类可以替换/包装超类方法,而不是相反。

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

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