[英]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.