我目前有一个数据库类,其中包含我从 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 {
...
}
}
在此上下文中可能存在一个合理的抛出异常。如果不是,请声明您自己的异常类。
如果您认为调用者需要尝试从中恢复,则检查异常是合适的。否则使用未经检查的异常。
要点是你的代码不应该捕获异常,除非它能够处理它。打印堆栈跟踪并继续执行很少是处理异常的正确方法。
添加回答
举报
0/150
提交
取消