gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:31:22 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com