java - 在简单的数据库驱动的 Java Web 应用程序中使用异常

标签 java exception web-applications exception-handling dao

我有一个关于中型 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/

相关文章:

c# - 代码未捕获 C# 中的 FormatException

c++ - 重新抛出具有相同消息的新异常会导致垃圾输出。为什么?

java - 在java中使用Imgur API时出现401错误

java - 如何防止 Cassandra 的数据流读取并行度降低

java - 如何在 Netty 中分块 List<Object>

apache-flex - 优化 Flex 应用程序 - 在哪里可以找到我的瓶颈

javascript - Angular 1.x 应用程序迁移到 Angular 5

java - 在具有多个按钮的 fragment 中启动 Activity

Java catch block ,捕获的异常不是最终的

javascript - 独立网络应用程序链接脚本 - 阻止它附加具有特定类的链接?