我有一个关于中型 Java Web 应用程序异常的问题。 有一个使用 JDBC 实现的数据访问层,其逻辑主要集中在一个 servlet 中(UI 是 JSP)。像这样的应用程序的常规异常层次结构是什么?
我应该在数据访问层捕获异常并为整体重新抛出另一个异常(例如 DataAccessException)还是让最高级别处理它们(servlet)。
此外,我有一个在数据访问层中调用的连接池,它有自己的异常类型。这些异常应该在数据访问层中捕获并作为 DataAccessException 重新抛出,还是应该由更高级别直接处理?
如果主应用程序异常有两个子异常:LogicException 和 TechnicalException,会不会是个好主意。逻辑将具有类似于 AuthentificationFailedException 等的子类,而 TechnicalExceptions 将负责传达有关故障的信息,如数据访问层异常、FileNotFound(虽然它应该是)等等?
谢谢!
最佳答案
通常,我会用更高级别、更有意义的异常来包装较低级别的异常。这通常需要更多工作,但可以让您在层之间解耦。
假设我正在编写一个恰好从数据库中读取的配置子系统。如果我不换行,我会得到类似的东西:
public String getConfigurationProperty(String name) throws SQLException {
// Try to read from my configuration table
}
如果我做包装,我会
public String getConfigurationProperty(String name) throws ConfigurationException {
try {
// Try to read from my configuration table
} catch (SQLException ex) {
ConfigurationException wrapper = // Some subclass of ConfigurationException that wraps ex
throw wrapper;
}
}
这绝对是更多的工作。优点是,如果以后我想将我的配置后端更改为基于文件的后端,没有包装器,我的方法将变为
public String getConfigurationProperty(String name) throws IOException {
// Try to read from my configuration file
}
然后我将不得不更改我所有的客户端代码来处理IOException
而不是SQLException
。如果您进行包装,您只需要更改后端,因为您的客户端代码已经在编写时考虑了 ConfigurationException
及其子类。请注意,这与您使用已检查或未检查的异常无关:如果您想进行异常处理,您几乎总是需要至少了解您要处理的异常类型的一些近似值。
现在,这就是我倾向于做的事情。有些人认为无论如何都无法正确处理大多数异常,而且大多数时候所有这些包装都是无稽之谈。
public String getConfigurationProperty(String name) throws ConfigurationException {
try {
// Try to read from my configuration file
} catch (IOException ex) {
ConfigurationException wrapper = // Some subclass of ConfigurationException that wraps ex
throw wrapper;
}
}
关于java - 在简单的数据库驱动的 Java Web 应用程序中使用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10590127/