spring boot异常捕获的四种方式

1.通过自定义错误页面

spring boot默认的处理异常的机制:spring boot默认的提供了一套处理异常的机制,一旦出现程序异常spring
boot会向/error发起请求。在spring boot中提供了一个 叫Base exception
controller的类来处理/error的请求。然后跳转到默认的异常显示页面来展示错误信息。

如果我们需要将所有的统一跳转到自定义的错误页面,需要在/src/main/resources/templates目录下创建error.html页面
例如:


	@RequestMapping("/show")
	public String showInfo() {
		System.out.println("come in");
		String str = null;
		str.length();
		return "index.html";
	}
	@RequestMapping("/show2")
	public String showInfo2() {
		System.out.println("come in");
		int a = 10/0;
		return "index.html";
	}

中途出了错误会会自动跳转到error页面。
2.@ExceptionHandler注解异常捕获然后处理
参数***Exception会将产生的异常注入到产生的方法中,但是这个注解有个缺点就是只能针对本类中的异常做处理,并不能对整个项目的异常做处理
例如:

@ExceptionHandler(value = {java.lang.NullPointerException.class, java.lang.ArithmeticException.class})
	
	
	public ModelAndView NullPointerException(Exception e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error",e.toString());
		mv.addObject("status","500");
		mv.setViewName("error1");
		return mv;
	}
	@ExceptionHandler(value = {java.lang.NullPointerException.class})
	public ModelAndView NullPointerException(NullPointerException e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error",e.toString());
		mv.addObject("status","500");
		mv.setViewName("error1");
		return mv;
	}

3.@ControllerAdvice+@ExceptionHandler结合使用
这种情况是一般项目中普遍使用的异常捕捉方法,这样的话就可以对全局的异常进行捕获,还能对异常进行处理,相对于以上甚至以下的方法都很好用

@ControllerAdvice
public class GlobalException {

	@ExceptionHandler(value = { java.lang.NullPointerException.class })
	public ModelAndView NullPointerException(NullPointerException e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.addObject("status", "500");
		mv.setViewName("error1");
		return mv;
	}

	@ExceptionHandler(value = {java.lang.ArithmeticException.class })

	public ModelAndView NullPointerException(ArithmeticException e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.addObject("status", "500");
		mv.setViewName("error1");
		return mv;
	}

	/*@ExceptionHandler(value = { java.lang.NullPointerException.class, java.lang.ArithmeticException.class })
	public ModelAndView NullPointerException(Exception e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.addObject("status", "500");
		mv.setViewName("error1");
		return mv;
	}*/

在具体的应用中,不管原先的方法返回值如何,只要出现异常就会被该注解捕获,原先方法的返回值和该注解的返回值并没有关系,该注解所对应的方法返回的数据前端都收得到。
4.HandlerExceptionResolver全局异常处理类
这种方法有一定的局限性,但是使用起来也很方便,它只能返回ModelAndView对象
例如:


@Configuration
public class GlobalException implements HandlerExceptionResolver {
	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		ModelAndView mv = new ModelAndView();
		if(ex instanceof NullPointerException) {
			mv.setViewName("error");
		}
		if(ex instanceof ArithmeticException) {
			mv.setViewName("error1");
		}
		mv.addObject("error",ex.toString());
		return mv;
	}
}

error,error1对应的是/src/main/resources/templates目录下创建error.html页面

简化版的是:


	/*
	 * 该方法必须有返回值,返回值类型为:SimpleMappingExceptionResolver
	 * 
	 * 有点是简化了前面的方法,但是不能传递异常对象
	 */
	@Bean
	public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
		SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
		Properties mappings = new Properties();
		/*
		 * 
		 * 参数一:异常的类型,注意必须是异常类型的全名
		 * 
		 * 参数二:跳转到视图的视图名称
		 * 
		 * */
		mappings.put("java.lang.NullPointerException", "error");
		mappings.put("java.lang.ArithmeticException", "error1");
		resolver.setExceptionMappings(mappings);
		return resolver;
	}

demo下载:https://download.csdn.net/download/qq_23095607/12376744

你可能感兴趣的:(异常,spring,boot,java)