亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號