【问题标题】:How Runtime Exceptions are handled by Spring ExceptionHandlerSpring ExceptionHandler 如何处理运行时异常
【发布时间】:2016-04-27 07:32:37
【问题描述】:

我正在使用 spring 的 @ControllerAdvice 和 @ExceptionHandler 进行异常处理。 任何方法都会从 Controller 抛出自定义异常,并由相应的 @ExceptionHandler 处理它。如果发生运行时异常(例如任何 HibernateException),那么它将抛出运行时异常,并且我没有任何 @ExceptionHandler 用于运行时异常。

我的问题是如何处理任何运行时异常?我需要为控制器抛出的每个异常添加@ExceptionHandler 吗? 我不想为 Exception.class 创建一个 Generic ExceptionHandler,因为我必须根据发生的异常发送不同的错误代码。

一种方法是在 Controller 中添加 try catch 块,然后从 catch 块中抛出自定义异常? 还是有其他更好的方法?

所有@ExceptionHandler 都在@ControllerAdvice 类中。

【问题讨论】:

  • 您处理运行时异常的方式与处理已检查异常的方式相同。为HibernateException添加一个ExceptionHandler,它将处理控制器抛出的HibernateExceptions。
  • @JBNizet 感谢您的评论。
  • 由于数据库中的重复条目,我收到 MySQLIntegrityConstraintViolationException。如果我为此异常创建单独的 ExceptionHandler 并返回任何消息,例如“记录已存在”,但可能由于其他原因引发了相同的异常,在这种情况下,我的消息不合适。这种情况该如何处理?
  • 消息应该是通用的,并作为最后的手段显示。您应该首先尝试避免该异常,方法是在插入该记录之前检查它尚不存在。

标签: spring exceptionhandler


【解决方案1】:

另一种方法是不要在Controller 中捕获Exception。在service 层中捕获所有Exception 并抛出自定义异常,例如。如果您保留记录失败,请使用消息抛出 DatabaseException。见下面的方法:

Student persist(Student object){
   try{
      studentDao.insert(object);
   }catch(HibernateException e){
      throw new DatabaseException("database operation failed!");
   }
   return student;
}

从您的异常处理程序方法中,您可以获得消息。这样你就可以在不同的 Exception 上设置不同的消息。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2019-11-23
    • 1970-01-01
    • 2017-05-28
    • 2011-02-21
    • 1970-01-01
    • 2011-07-24
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多