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

Java 我应该在哪里抛出自定义异常并捕获异常对象,java,spring,hibernate,exception,Java,Spring,Hibernate,Exception,我正在编写一个SpringMVC,hibernate应用程序。在控制器、服务或DAO中,我无法决定应该在哪里抛出自定义异常、抛出什么自定义异常以及在哪里捕获“异常” 我试图在控制器和服务中抛出一个自定义异常,并在控制器中捕获“异常”作为最后一个捕获块。但每次抛出自定义异常时,最后一个catch块(异常的)就会捕获它,并抛出CustomGenericException来覆盖前一个 //控制器 @PostMapping("/add/{user_id}/{book_id}") public @Resp

我正在编写一个SpringMVC,hibernate应用程序。在控制器、服务或DAO中,我无法决定应该在哪里抛出自定义异常、抛出什么自定义异常以及在哪里捕获“异常”

我试图在控制器和服务中抛出一个自定义异常,并在控制器中捕获“异常”作为最后一个捕获块。但每次抛出自定义异常时,最后一个catch块(异常的)就会捕获它,并抛出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.";
}
@覆盖
公共字符串addBook(int user\u id,int book\u id){
if(bookDAO.getCount(book_id)>0){
购物车=新购物车(用户id、图书id);
List userCarts=cartDAO.getCart(用户id,0);
对于(购物车c:用户购物车){
if(c.getBook_id()==book_id){
返回“图书已在购物车中!”;
}
}
List issuedBooks=cartDAO.getCart(用户id,1);
用于(购物车c:已发行图书){
if(c.getBook_id()==book_id){
return“图书已发行。无法将其他图书添加到购物车。”;
}
}
返回cartDAO.addBookToCart(购物车);
}
return“已无剩余副本。请稍后再试。”;
}

我想知道我应该在哪里抛出异常,在哪里捕获它们,以及如何避免自定义抛出的异常被最后一个catch块捕获。

@aks如果要抛出选中的异常,那么应该将“原因”异常传递给更高级别的异常构造函数(在本例中是最后一个捕获)由于其他原因,原因信息丢失。核心异常类具有导致参数通过的构造函数。 您也可以尝试使用控制器建议
我希望我能帮上一点忙:)

阅读Java中的链式异常


您没有在自定义异常中包装异常对象,这就是为什么您感觉上一个异常正在被覆盖。

取决于许多因素。对于最后一部分,如果您不想同样处理所有异常,请不要捕获所有异常。如果要以另一种方式处理1个特定异常,请为其添加一个特定的catch块(在泛型块之前)