我目前有一個數據庫類,其中包含我從 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
提交
取消