SpringBoot中的异常处理方式
- 自定义错误页面
- @ExceptionHandle注解处理异常
- @ControllerAdvice + @ExceptionHandle注解处理异常
- 配置SimpleMappingExceptionResolver处理异常
- 自定义HandleExceptionResolver类处理异常
1 自定义错误页面
1.1 SpringBoot的默认异常机制详解
SpringBoot默认的异常机制:SpringBoot默认已经提供了一套处理异常的机制。
一旦程序中出现了异常,SpringBoot会向/error的url发送请求。在SpringBoot中提供了一个
叫BasicExceptionController来处理/error请求,然后跳转到默认显示的页面来展示异常信息。
1.2 自定义错误界面
如果我们需要将所有的异常统一跳转到自定义错误页面,需要在classpath下创建一个templates目录(即在resources目录下创建templates目录),在该目录下创建一个名为error.html的页面。
2 基于@ExceptionHandler注解处理异常
2.1 创建指定处理的异常
/**
*java.lang.ArithmeticException
*该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
*参数Exceptione:会将产生异常对象注入到方法中
*/
@ExceptionHandler(value={java.lang.ArithmeticException.class})
publicModelAndViewarithmeticExceptionHandler(Exceptione){
ModelAndViewmv=newModelAndView();
mv.addObject("error",e.toString());
mv.setViewName("error1");
returnmv;
}
/**
*java.lang.NullPointerException
*该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
*参数Exceptione:会将产生异常对象注入到方法中
**/
@ExceptionHandler(value={java.lang.NullPointerException.class})
publicModelAndViewnullPointerExceptionHandler(Exceptione){
ModelAndViewmv=newModelAndView();
mv.addObject("error",e.toString());
mv.setViewName("error2");
return mv;
}
2.2 使用该方法的总结
使用@ExceptionHandler注解处理异常时,首先编写异常页面error.html,其次创建Controller类,编写基于注解@ExceptionHandle注解的方法,并且在该方法中必须指定想要助理异常的名称如上面的java.lang.NullPointerException.class、java.lang.ArithmeticException.class。
3 使用@ControllerAdvice + @ExceptionHandler注解处理异常
3.1 创建一个全局异常类使用ControllerAdvice注解
/**
*全局异常处理类
**/
@ControllerAdvice
public class GlobalException {
/**
* java.lang.ArithmeticException
* 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
* 参数Exceptione:会将产生异常对象注入到方法中
**/
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView arithmeticExceptionHandler(Exceptione) {
ModelAndViewmv = newModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("error1");
returnmv;
}
/**
* java.lang.NullPointerException
* 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定
* 参数Exceptione:会将产生异常对象注入到方法中
**/
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView nullPointerExceptionHandler(Exceptione) {
ModelAndViewmv = newModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("error2");
}
}
3.1.1 创建时首先定义一个使用@ControllerAdvice注解的类
3.1.2 在类中使用@ExceptionHandler注解标识需要处理的异常
总结:使用@ControllerAdvice + @ExceptionHandler注解可以解决全局问题。
4 配置SimpleMappingExceptionResolver处理异常
4.1 创建一个使用@Configuration注解的全局类GlobalException类
4.2 在该类中创建一个@Ben注解的方法,返回值为SimpleMappingExceptionResolver的方法,在该方法体中添加需要处理的异常即可
/**
*通过SimpleMappingExceptionResolver做全局异常处理
**/
@Configuration
public class GlobalException {
/**
* 该方法必须要有返回值。返回值类型必须是:SimpleMappingExceptionResolver
**/
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolverresolver = newSimpleMappingExceptionResolver();
Propertiesmappings = newProperties();
/**
* 参数一:异常的类型,注意必须是异常类型的全名
* 参数二:视图名称
**/
mappings.put("java.lang.ArithmeticException", "error1");
mappings.put("java.lang.NullPointerException", "error2");
//设置异常与视图映射信息的
resolver.setExceptionMappings(mappings);
return resolver;
}
}
5 自定义HandleExceptionResolver类处理异常
5.1 创建一个使用@Configuration标识的类,并实现HandleExceptionResolver接口
5.2 在该接口中重写resolveException方法,在该方法体中标明异常跳转的error页面即可
/**
*通过实现HandlerExceptionResolver接口做全局异常处理
**/
@Configuration
public class GlobalExceptionimplementsHandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){
ModelAndViewmv=newModelAndView();
//判断不同异常类型,做不同视图跳转
if(exinstanceofArithmeticException){
mv.setViewName("error1");
}
if(exinstanceofNullPointerException){
mv.setViewName("error2");
}
mv.addObject("error",ex.toString());
return mv;
}
}