【问题标题】: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】:
超类不能“处理”子类异常。
子类可以替换/包装超类方法,而不是相反。
但是,您可以将代码重构为多个部分:
- 执行 select 语句等常见功能可能是
移至 executeQuery 之类的方法。
- 这可以在基类中使用。子类可以
使用这个基类方法,只需传递适当的 sql 查询
到那个方法。
- 在这种情况下,executeQuery 方法可以处理异常,例如
SQLException 并将它们包装到特定于应用程序的未选中
异常(或在可接受的情况下静默处理异常)。