簡體   English   中英

在層架構中重現 SQL 異常並正確處理

[英]Reproducing SQL Exception and correct handling in layer architecture

可以說我有這個:

String sql = "DELETE FROM "+ TABLE_NAME +"  WHERE id=?";
       
try {
    int ra = jdbcTemplate.update(connection -> {
                PreparedStatement stmt = connection.prepareStatement(sql);
                stmt.setLong(1, id);
                stmt.executeUpdate();
                return stmt;
            });

    if (ra == 0)
        throw new SQLException(SQL_ERROR);
} catch (SQLException e){
    LOGGER.error(SQL_ERROR);
    throw new DataAccessLayerException("Entity could not be deleted due to SQL Exception");
}

我正在從表中刪除一個帶有鍵(id)的實體。 現在我希望能夠向客戶端報告INTERNAL_SERVER_ERROR而不會導致RuntimeException

但是,我無法重現SQLException 例如,如果我在我的 sql 語句中刪除一個字母,我只會收到一個語法錯誤,該錯誤被作為運行時錯誤拋出,而且似乎我沒有抓住它。

幫助我理解 SQLException 在這里的確切含義,以及如何在不導致 RuntimeException 的情況下重現它並將其報告給客戶端?

你的代碼是錯誤的。 您正在調用update(PreparedStatementCreator psc) ,顧名思義,您的代碼應該創建一個完全“准備好的”語句對象,但不應“執行”該語句,因此刪除executeUpdate()調用。

update()調用拋出DataAccessException ,而不是SQLException ,因此該try塊中SQLException的唯一來源是您的if語句,因此您不妨直接拋出該DataAccessLayerException異常。 不過,我建議改為拋出EmptyResultDataAccessException

由於 Spring 專門將檢查的SQLException轉換為未檢查的DataAccessException運行時異常,因此在使用 Spring JDBC 時您總是會得到運行時異常,這是一件好事,因為您現在不需要為代碼中的所有方法添加檢查的異常。

未處理的異常由 Spring MVC 處理。 默認情況下,Spring MVC 將重定向到錯誤頁面。 如果您不希望那樣,請參閱問題Spring Boot Remove Whitelabel Error Page

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM