我应该在哪里抛出自定义异常并捕获异常对象

时间:2019-09-25 10:31:31

标签: java spring hibernate exception

我正在编写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块捕获。

2 个答案:

答案 0 :(得分:0)

@aks如果要抛出已检查的异常,则应将“原因”异常传递给更高级别的异常构造函数(在本例中为最后一个捕获),因为否则会丢失原因信息。核心异常类具有带原因参数的构造函数。 您也可以尝试使用控制器建议https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc 我希望我能有所帮助:)

答案 1 :(得分:0)

了解Java here中的链式异常

您没有在自定义异常中包装异常对象,这就是为什么您感觉以前的异常已被覆盖。