interview
spring
SpringMVC中如何处理异常?

Spring面试题, Spring MVC 中如何处理异常?

Spring面试题, Spring MVC 中如何处理异常?

QA

Step 1

Q:: Spring MVC 中如何处理异常?

A:: 在 Spring MVC 中处理异常可以通过多种方式实现,主要有以下几种: 1. 使用 @ExceptionHandler 注解:可以在控制器类中定义一个方法,并使用 @ExceptionHandler 注解来指定处理特定异常类型。 2. 使用 @ControllerAdvice 注解:可以定义一个全局异常处理类,使用 @ControllerAdvice 注解,并结合 @ExceptionHandler 注解来处理应用中所有控制器的异常。 3. 配置全局异常处理器:通过实现 HandlerExceptionResolver 接口来自定义全局异常处理器,比如 SimpleMappingExceptionResolver。 4. 自定义异常页面:通过配置 web.xml 文件或在 Spring 配置中设置特定异常类型的错误页面。 5. 使用 ResponseStatusException:在控制器中直接抛出 ResponseStatusException,并指定 HTTP 状态码和原因。 这些方法可以帮助开发人员在不同层次上灵活地处理应用中的异常情况。

Step 2

Q:: @ExceptionHandler 注解的使用方法是什么?

A:: @ExceptionHandler 注解用于在控制器类中定义异常处理方法。例如:

 
@Controller
public class MyController {
    @ExceptionHandler(MyException.class)
    public ModelAndView handleMyException(MyException ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}
 

在上面的代码中,当 MyException 异常被抛出时,handleMyException 方法会被调用,并返回一个带有错误信息的视图。

Step 3

Q:: @ControllerAdvice 注解的作用是什么?

A:: @ControllerAdvice 注解用于定义一个全局的异常处理类,该类可以处理所有控制器抛出的异常。例如:

 
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleAllExceptions(Exception ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}
 

这样,无论哪个控制器抛出异常,handleAllExceptions 方法都会被调用。

Step 4

Q:: 如何自定义 Spring MVC 的全局异常处理器?

A:: 可以通过实现 HandlerExceptionResolver 接口来自定义全局异常处理器。例如:

 
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}
 

然后在 Spring 配置文件中注册这个自定义的异常处理器。

用途

处理异常是构建健壮和用户友好的应用程序的重要部分。在实际生产环境中,异常处理机制可以帮助捕获并处理运行时错误,提供更好的用户体验,并且可以记录错误信息以便于调试和维护。在面试中,面试官通过询问异常处理相关问题,可以评估候选人对应用程序健壮性和可维护性的理解和实践经验。\n

相关问题

🦆
如何在 Spring Boot 中处理全局异常?

在 Spring Boot 中处理全局异常通常使用 @ControllerAdvice 注解。定义一个带有 @ControllerAdvice 注解的类,并使用 @ExceptionHandler 注解来处理特定的异常类型。

 
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleAllExceptions(Exception ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
 

这种方式可以处理所有控制器抛出的异常,并返回一个适当的 HTTP 响应。

🦆
Spring 中的 @ResponseStatus 注解有什么作用?

@ResponseStatus 注解用于标记异常类或控制器方法,以便当抛出这些异常时,Spring MVC 可以自动设置 HTTP 响应状态。例如:

 
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}
 

当 ResourceNotFoundException 被抛出时,HTTP 响应状态会被设置为 404 Not Found。

🦆
如何在 Spring MVC 中配置自定义错误页面?

可以通过在 web.xml 文件中配置错误页面来处理特定的 HTTP 状态码或异常。例如:

 
<error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/views/error/404.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/WEB-INF/views/error/error.jsp</location>
</error-page>
 

这样,当发生 404 错误或其他异常时,Spring MVC 会转到相应的 JSP 页面。