我正在编写Spring MVC休眠应用程序。我无法决定在控制器或服务或DAO中应该在哪里抛出自定义异常,在哪里抛出哪些自定义异常以及在何处捕获“异常”?
我试图在控制器和服务中引发自定义异常,并在控制器中捕获“ Exception”作为最后一个捕获块。但是,每次抛出自定义异常时,最后一个catch块(Exception)都会捕获该异常,并抛出CustomGenericException来覆盖前一个异常。
//控制器
@PostMapping("/add/{user_id}/{book_id}")
public @ResponseBody
String addToCart(@PathVariable("user_id") Integer user_id,
@PathVariable("book_id") Integer book_id){
try {
return cartService.addBook(user_id, book_id);
}
catch (HibernateException | CannotCreateTransactionException dbException) {
throw new DatabaseDownException("Database error. Could not connect at this time.");
}
catch (Exception ex){
throw new CustomGenericException("Could not add book to cart at this time. Please try again later.");
}
}
//服务
@Override
public String addBook(int user_id, int book_id) {
if(bookDAO.getCount(book_id)>0) {
Cart cart = new Cart(user_id, book_id);
List<Cart> userCarts = cartDAO.getCart(user_id, 0);
for (Cart c : userCarts) {
if (c.getBook_id() == book_id) {
return "Book already in cart!";
}
}
List<Cart> issuedBooks =cartDAO.getCart(user_id, 1);
for(Cart c:issuedBooks){
if(c.getBook_id()==book_id){
return "Book already issued. Can't add another to cart.";
}
}
return cartDAO.addBookToCart(cart);
}
return "No more copies left. Please try again later.";
}
我想知道应该在哪里抛出异常,在哪里捕获它们以及如何避免自定义抛出的异常被最后一个catch块捕获。
答案 0 :(得分:0)
@aks如果要抛出已检查的异常,则应将“原因”异常传递给更高级别的异常构造函数(在本例中为最后一个捕获),因为否则会丢失原因信息。核心异常类具有带原因参数的构造函数。 您也可以尝试使用控制器建议https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc 我希望我能有所帮助:)
答案 1 :(得分:0)
了解Java here中的链式异常
您没有在自定义异常中包装异常对象,这就是为什么您感觉以前的异常已被覆盖。