Я кодирую Spring MVC, приложение гибернации.Я не могу решить, куда следует генерировать пользовательские исключения, какие пользовательские исключения генерировать и где отлавливать «Исключение» в контроллере или службе или DAO?
Я пытался выбросить пользовательское исключение в контроллере и службе ипоймать «Исключение» в контроллере как последний блок catch.Но каждый раз, когда выбрасывается пользовательское исключение, последний блок catch (of 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.