如何在 Java DAO 中管理异常?
How to manage exceptions in a Java DAO?
我正在 Java 编写我的第一个 DAO,我想知道如何管理可能发生的异常:
我当前的代码:
public void update(User userUpdate) throws Exception {
try (Connection dbConnection = ConnectionManager.getConnection(); PreparedStatement preparedStatement = dbConnection.prepareStatement(QUERY_UPDATE);) {
int userId = userUpdate.getId();
String userName = userUpdate.getName();
String userMail = userUpdate.getEmail();
String userPassword = userUpdate.getPassword();
int userIdRole = userUpdate.getRole().getId_role();
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userMail);
preparedStatement.setString(3, userPassword);
preparedStatement.setInt(4, userIdRole);
preparedStatement.setInt(5, userId);
int updatedRows = preparedStatement.executeUpdate();
if (updatedRows != 1) {
throw new Exception("We had a problem updating your details");
}
}
}
我不知道如何管理异常。调用这个方法的控制器有一个 catch
块来从 DAO 方法中获取异常,但是,我必须将什么样的异常发送回控制器,只是全局的? SQL 还有一个吗?
我是否必须在 DAO 方法中捕获某些内容(并创建反馈以将其发送给用户)或者只是将异常抛给控制器并让它们单独处理反馈?
谢谢!!
通常您会尝试从应用程序代码中封装特定的 IO 异常,例如 SQLException。因此,如果您使用一些通用的 DAO 构建一个简单的 CRUD 应用程序,您可以将 SQLException 映射到更具体的异常,例如 catch-clause 中的 UpdateFailedException() 并将此异常委托给控制器。根据您用于表示逻辑的框架或库,您可以使用类似全局错误处理程序的东西将此特定异常类型映射到 HTTP 响应代码(某些 crud 框架对此提供支持)。另一个问题是,当没有数据更新时,它真的是一个异常吗?如果没有更新数据,则没有找到给定的用户,您可以使用先决条件进行检查,并可能引发 NotFoundException,例如映射到 404 Http 代码。或者如果用户不在数据库中而不抛出异常,则只需创建一个。最后它可能看起来像这样:
public class Controller {
public HttpResponse updateUserAction(User user) {
try {
userDao.update(User user);
return new HttpResonse(200, "User has been updated.");
} catch (UpdateException ex) {
return new HttpResponse(500, ex.getMessage());
} catch (NotFoundException ex) {
return new HttpResponse(404, ex.getMessage());
}
}
}
public class UserDao {
public void update(User userUpdate) throws NotFoundException, UpdateException {
try (Connection dbConnection = ConnectionManager.getConnection(); PreparedStatement preparedStatement = dbConnection.prepareStatement(QUERY_UPDATE);) {
//check if user exists pseudocode
if (this.get(userUpdate.getId()) == null) throw new NotFoundException("User not found");
int userId = userUpdate.getId();
String userName = userUpdate.getName();
String userMail = userUpdate.getEmail();
String userPassword = userUpdate.getPassword();
int userIdRole = userUpdate.getRole().getId_role();
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userMail);
preparedStatement.setString(3, userPassword);
preparedStatement.setInt(4, userIdRole);
preparedStatement.setInt(5, userId);
preparedStatement.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
throw new UpdateException();
} catch (UpdateException ex) {
ex.prinntStackTrace();
throw ex;
}
}
}
我正在 Java 编写我的第一个 DAO,我想知道如何管理可能发生的异常:
我当前的代码:
public void update(User userUpdate) throws Exception {
try (Connection dbConnection = ConnectionManager.getConnection(); PreparedStatement preparedStatement = dbConnection.prepareStatement(QUERY_UPDATE);) {
int userId = userUpdate.getId();
String userName = userUpdate.getName();
String userMail = userUpdate.getEmail();
String userPassword = userUpdate.getPassword();
int userIdRole = userUpdate.getRole().getId_role();
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userMail);
preparedStatement.setString(3, userPassword);
preparedStatement.setInt(4, userIdRole);
preparedStatement.setInt(5, userId);
int updatedRows = preparedStatement.executeUpdate();
if (updatedRows != 1) {
throw new Exception("We had a problem updating your details");
}
}
}
我不知道如何管理异常。调用这个方法的控制器有一个 catch
块来从 DAO 方法中获取异常,但是,我必须将什么样的异常发送回控制器,只是全局的? SQL 还有一个吗?
我是否必须在 DAO 方法中捕获某些内容(并创建反馈以将其发送给用户)或者只是将异常抛给控制器并让它们单独处理反馈?
谢谢!!
通常您会尝试从应用程序代码中封装特定的 IO 异常,例如 SQLException。因此,如果您使用一些通用的 DAO 构建一个简单的 CRUD 应用程序,您可以将 SQLException 映射到更具体的异常,例如 catch-clause 中的 UpdateFailedException() 并将此异常委托给控制器。根据您用于表示逻辑的框架或库,您可以使用类似全局错误处理程序的东西将此特定异常类型映射到 HTTP 响应代码(某些 crud 框架对此提供支持)。另一个问题是,当没有数据更新时,它真的是一个异常吗?如果没有更新数据,则没有找到给定的用户,您可以使用先决条件进行检查,并可能引发 NotFoundException,例如映射到 404 Http 代码。或者如果用户不在数据库中而不抛出异常,则只需创建一个。最后它可能看起来像这样:
public class Controller {
public HttpResponse updateUserAction(User user) {
try {
userDao.update(User user);
return new HttpResonse(200, "User has been updated.");
} catch (UpdateException ex) {
return new HttpResponse(500, ex.getMessage());
} catch (NotFoundException ex) {
return new HttpResponse(404, ex.getMessage());
}
}
}
public class UserDao {
public void update(User userUpdate) throws NotFoundException, UpdateException {
try (Connection dbConnection = ConnectionManager.getConnection(); PreparedStatement preparedStatement = dbConnection.prepareStatement(QUERY_UPDATE);) {
//check if user exists pseudocode
if (this.get(userUpdate.getId()) == null) throw new NotFoundException("User not found");
int userId = userUpdate.getId();
String userName = userUpdate.getName();
String userMail = userUpdate.getEmail();
String userPassword = userUpdate.getPassword();
int userIdRole = userUpdate.getRole().getId_role();
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userMail);
preparedStatement.setString(3, userPassword);
preparedStatement.setInt(4, userIdRole);
preparedStatement.setInt(5, userId);
preparedStatement.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
throw new UpdateException();
} catch (UpdateException ex) {
ex.prinntStackTrace();
throw ex;
}
}
}