为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着星空守着你 2023-05-17 14:38:27
我目前有一个数据库类,其中包含我从 SQL 数据库检索数据的所有方法。一个方法看起来像:@Overridepublic 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来告诉成功和失败,但是还有其他方法吗?
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我想到了用Consumer来告诉成功和失败,但是还有其他方法吗?


你不需要赶上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 {

        ...

    }

}

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


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


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


查看完整回答
反对 回复 2023-05-17
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信