当发生 SQLException 时 Java 响应应用程序

标签 java jdbc

我当前有一个数据库类,其中包含从 SQL 数据库检索数据的所有方法。方法如下:

@Override
public void setGlobalSetting(Setting setting) {
    if(setting.getId() == 0) {
        try {
            PreparedStatement ps = this.conn.prepareStatement("INSERT INTO BotSettings(guildId, settingKey, settingValue) VALUES(?, ?, ?)");
            ps.setLong(1, -1);
            ps.setString(2, setting.getKey());
            ps.setString(3, setting.getValue());

            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    } else {
        try {
            PreparedStatement ps = this.conn.prepareStatement("UPDATE BotSettings SET settingValue = ? WHERE guildId = ? AND settingKey = ?");
            ps.setString(1, setting.getValue());
            ps.setLong(2, -1);
            ps.setString(3, setting.getKey());

            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

问题是我无法告诉我的应用程序何时发生 SQLException,以便应用程序可以向用户响应应用程序无法保存数据。 我怎样才能实现一种可以告诉应用程序失败的方法。我想到用Consumer来告诉成功和失败,但是还有其他方法吗?

最佳答案

I thought of using Consumer to tell success and failure, but are there other ways?

您不需要捕获SQLException。您可以想象允许它传播到可以适当处理它的更高级别。

或者,您可以抛出一个新的异常。例如:

public void setGlobalSetting(Setting setting) throws MyException {
    if(setting.getId() == 0) {
        try {
            ...
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new MyException("Cannot set setting due to database error", e);
        }
    } else {
        ...
    }
}

在此上下文中可能存在一个合理抛出的异常。如果没有,请声明您自己的异常类。

如果您认为调用者需要尝试从中恢复,则检查异常将是合适的。否则使用未经检查的异常。

<小时/>

要点是您的代码不应该捕获异常,除非它能够处理它。打印堆栈跟踪并继续很少是处理异常的正确方法。

关于当发生 SQLException 时 Java 响应应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57343421/

相关文章:

java - AdMob 奖励视频广告的静态奖励金额

java - sendRedirect URL 在 JBOSS 7.2 中附加了根 url

java - 如何针对特定列过滤 JTable?

java - 除非有新日志,否则 TimeBasedRollingPolicy 不会滚动

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

java - Logback DBAppender DDL?

java - 如何在 JDBC 中正确初始化创建表 servlet?

java - Spring 和接口(interface)

java - 找不到适合 jdbc :ucanaccess://C:\Users\Asim Iqbal\Documents\PersonInfo. accdb 的驱动程序

java - 线程中的异常 "main"java.sql.SQLException : No database selected