• Spring MVC处理异常


    Spring MVC异常

    Spring MVC处理异常的接口 HandlerExceptionReslover接口,实现类:ExceptionHandlerExceptionResolver ,主要提供了@ExceptionHandler注解,并通过该注解处理异常

    处理异常的方式

    1、实现HandlerExceptionResolver接口

    2、单独使用@HandlerException注解

    3、使用@ControllerAdvice + @HandlerException

    1、实现HandlerExceptionResolver接口

    package com.xingwei.handler;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyException implements HandlerExceptionResolver{
    	
    	
    	@Override
    	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
    			Exception ex) {
    		System.out.println(ex.getMessage());  //查看具体的异常信息
    		ModelAndView modelAndView = new ModelAndView() ;
    		modelAndView.setViewName("/error.jsp");
    		return modelAndView;
    	}
    
    }
    
    

    这种实现接口的方式需要在SpringMVC配置文件中注入bean

    <bean id="myException" class="com.xingwei.handler.MyException"></bean>
    

    2、使用@ExceptionHandler注解

    基于接口的实现类:ExceptionHandlerExceptionResolver,主要提供了@ExceptionHandler注解,并且通过该注解来处理异常

    //该方法 可以捕获本类中  抛出的ArithmeticException异常
    
    @ExceptionHandler({ArithmeticException.class,ArrayIndexOutOfBoundsException.class  })
    public String handlerArithmeticException(Exception e) {
    	System.out.println(e +"============");
    	return "error" ;
    }
    

    缺点:

    @ExceptionHandler默认只能处理当前类的异常,不能处理其他类的异常

    使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面

    3、@ControllerAdvice + @ExceptionHandler

    这也是 Spring 3.2 带来的新特性。从名字上可以看出大体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。

    package com.xingwei.handler;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.servlet.ModelAndView;
    
    @ControllerAdvice //不是控制器,只是用于处理异常的类
    public class MyExceptionHandler {
    	
    	@ExceptionHandler({Exception.class})
    	public ModelAndView testMyException(ArithmeticException e) {
    		ModelAndView mv = new ModelAndView("error");  //转发到error页面
    		mv.addObject("e", e)	;
    		System.out.println(e +"=============="+"@ControllerAdvice中处理异常的方法,可以用于处理任何类的异常");
    		return mv ;
    	}
    
    }
    

    注意点

    @ExceptionHandler标识的方法的参数,必须在异常类型(Throwable或其子类,后面不能跟其他参数,比如ModelAndView,结果我个人大量尝试,可以加Model) ,不能包含其他类型的参数

    参考:https://blog.csdn.net/qq_36951116/article/details/79976414

    总结

    • @ControllerAdvice 不是控制器,只是用于处理异常的类

    • @ExceptionHandler默认只能处理当前类的异常,不能处理其他类的异常,

    • 如果发生异常的方法和处理异常的方法不在同一个类中,则默认不会处理,如果想要处理,则需要增加一个注解 @ControllerAdvice

    做的不好,多多指教
  • 相关阅读:
    phome_enewsclass 数据表字段解释(栏目主表)
    phome_ecms_news 数据表字段解释(新闻系统模型-主表)
    帝国cms7.2灵动标签万能教程
    帝国cms7.2自定义列表建立tag效果 代码 教程
    栏目自定义变量怎么用?
    给你的网站404页面加上“宝贝寻亲”公益页面
    discuz_style_default.xml修改
    谈谈几大宗教.
    discuz默认模板文件结构详解-模板文件夹介绍
    一些适合用手柄玩的网络游戏
  • 原文地址:https://www.cnblogs.com/xingStudy/p/14197007.html
Copyright © 2020-2023  润新知