Где я должен бросить пользовательские исключения и поймать объект исключения - PullRequest
0 голосов
/ 25 сентября 2019

Я кодирую 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.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

читайте о сцепленном исключении в Java здесь

вы не переносите объект исключения в свое пользовательское исключение, поэтому вы чувствуете, что предыдущее исключение переопределяется.

0 голосов
/ 25 сентября 2019

@ aks Если вы хотите выбросить проверенные исключения, вы должны передать конструктор исключений «причина» на более высокий уровень (в данном случае последний перехватывает), потому что в других случаях информация о причине теряется.Базовый класс исключений имеет конструктор с параметром причины для передачи.Вы также можете попробовать использовать Controller Advice https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc Надеюсь, я немного помог: :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...