• springmvc异常处理


    1.全局异常

    1.1使用SimpleMappingExceptionResolver

    这种方式是处理全局异常,只要有对应的异常抛出,就会使用这个bean进行处理。使用SimpleMappingExceptionResolver的话,只要在springmvc配置文件中做如下声明就可以了。

        <bean
            class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <-- 默认的异常界面,如果不是特殊指定的异常,都显示这个界面 -->
            <property name="defaultErrorView" value="/exception/handle/errorGlobal" />
            <-- 异常的名称,界面上可以使用这个来输出异常信息 -->
            <property name="exceptionAttribute" value="e" />
            <-- 指定特殊异常,并为特殊异常指定特定的界面 -->
            <property name="exceptionMappings">
                <props>
                    <prop
                        key="xyz.zeling.exception.handle.modules.exception.handle.UserNotFoundException">/exception/handling/errorUser</prop>
                </props>
            </property>
        </bean>

    1.2继承于HandlerExceptionResolver

    这个是全局异常,只要有对应的异常抛出,就会使用这个类进行处理。注意使用这种方式的话,需要使这个类成为bean,可以使用注解方式,也可以在spring配置文件中声明。这个例子使用的是注解的方式。

    @Component
    public class GlobalExceptionHandlerAnother implements HandlerExceptionResolver {
    
        /**
         * 异常处理方法,ex就是程序抛出的异常
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
            return new ModelAndView("/exception/handle/errorGlobal");
        }
    }

    1.3使用@ControllerAdvice

    这个也是全局异常,只要有对应的异常抛出,就会使用@ExceptionHandler注解的方法进行处理,@ControllerAdvice注解的类除了有处理异常的@ExceptionHandler方法外,还有其它两个注解方法,感兴趣的同学可以自行研究。

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        public ModelAndView handleException(Exception e) {
            System.out.println("打印异常信息:");
            e.printStackTrace();
            return new ModelAndView("/exception/handling/errorGlobal");
        }
    }

    2.局部处理异常

    2.1使用@ResponseStatus注解自定义异常

    @ResponseStatus可以自定义返回状态码和提示信息。
    使用方式,先自定义一个异常,并使用@ResponseStatus注解

        @ResponseStatus(
        value = HttpStatus.BAD_REQUEST,
        reason = "测试自定义返回码")
    public class UserNotFoundException extends Exception {
        private static final long serialVersionUID = -8695002135215307249L;
    
        public UserNotFoundException(String name) {
            super("User not found with name: " + name);
        }
    }

    然后在你想抛出这个异常的地方进行抛出

            if (user == null) {
                throw new UserNotFoundException(name);
            }

    程序运行到这里之后,界面上就会返回一个自定义状态码和自定义提示信息。
    PS:这个处理异常的方式会被@ControllerAdvice处理方式覆盖掉,其它的全局处理异常会不会覆盖没测试过,如果有测过的同学麻烦帮忙评论告知。

    2.2 Controller层里面使用@ExceptionHandler注解

    这种方式处理的异常只针对于使用的那个Controller方法,使用方式:

    @Controller
    @RequestMapping("/exception/handling")
    public class ExceptionHandleController {
    
        @RequestMapping("/main")
        public ModelAndView toMain() {
            return new ModelAndView("/exception/handling/main");
        }
    
        /**
         * @description TODO
         * @date 2018年1月29日 下午11:50:58
         * @param e 注解使用的异常,可以当作参数
         * @return
         * @throws Exception
         */
        @ExceptionHandler(UserNotFoundException.class)
        public ModelAndView handleException(UserNotFoundException e) {
            // 异常处理逻辑
            // ...
            return new ModelAndView("/exception/handling/errorUser");
        }
    }

    结语

    有错误的地方麻烦评论指正一下哈,共勉。

  • 相关阅读:
    浅谈MVC3.0 及其URL路由机制
    了解 NHibernate
    ASP.NET与 .NET MVC的认识
    ASP.NET中的Webservice
    MVC3.0 将网站设为首页和加为收藏的实现(IE/Firefox)
    ASP.NET页面生命周期
    MVC3.0 开发过程中遇到错误及解决方案(不断更新中。。。)
    scienceWord总结
    设计模式——结构型模式(包含7种)
    sql 、linq、lambda 查询语句的区别
  • 原文地址:https://www.cnblogs.com/zeling/p/8494842.html
Copyright © 2020-2023  润新知