首页 专题 文章 代码 归档
SpringMVC异常解析器
2020.02.03 15:04 2020.02.03 15:04

1. 异常解析器

1.1. 概述

项目中会面临各种异常:

  • 运行时异常,大多会在开发测试阶段解决掉。
  • 非运行时异常,是必须要处理的。
  • 业务异常,是根据业务要求,在出现非法情况时,人为抛出的。

1.2. 解决方案

将dao、service层的异常无条件上抛,交给Controller层。

1.3. 方案1

C中的每个Handler处理自己的异常

public String test(){
    try{


    }catch (ex1 e){

    }catch (ex2 e){

    }catch (ex2 e){

    }
}

每个不同的异常都单独捕获,方便对应不同的处理。

当然,实际上也不推荐在Handler中大篇幅代码来处理异常。

1.4. 方案2

异常处理器

C中的每个Handler不再自己处理异常,而是直接上抛所有异常。

定义一个“异常解析器”集中捕获处理所有异常。这也符合类的单一职责原则。

自定义异常处理步骤稍微有点多,如下:

1.4.1. 定义一个异常处理类

com.misiai.resolver.MyExceptionResolver

package com.misiai.resolver;

import com.misiai.exception.LoginException;
import com.misiai.exception.PermissionException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;

/**
 * 定义一个异常处理器
 */
public class MyExceptionResolver implements HandlerExceptionResolver {
    /**
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @return 返回一个处理异常的视图
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();

        // 判断不同异常
        if (ex instanceof LoginException) {
            // 登录异常
            modelAndView.setViewName("redirect:/user/login");
        } else if (ex instanceof PermissionException) {
            // 权限异常
            modelAndView.setViewName("redirect:/user/permission");
        } else {
            // 其他未考虑到的异常
            modelAndView.setViewName("redirect:/xx/xx3");
        }
        return modelAndView;
    }
}

解释:

1、该类继承自HandlerExceptionResolver,实现其resolveException即可。

2、在resolveException方法中,我们只需要判断是否是某个异常的实例,是的话就跳转某个提示页面,或进行其他处理。

1.4.2. 注册异常处理类

在springMVC的配置文件:

<!--自定义的异常解析器-->
<bean class="com.misiai.resolver.MyExceptionResolver"/>
1.4.3. 自定义异常类

我们这里自定义了几个异常处理类,这些类继承自RuntimeException

package com.misiai.exception;

public class LoginException extends RuntimeException {
    public LoginException() {
    }

    public LoginException(String message) {
        super(message);
    }
}

解释:

1、可以不自定义,可以直接使用系统自带的异常就行。但是在真实环境中,一般都需要自定义处理。

1.4.4. 测试代码
package com.misiai.controller;

import com.misiai.exception.LoginException;
import com.misiai.exception.PermissionException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 以下两个test,用来测试权限问题
     */
    @RequestMapping("/test01")
    public void test01() {
        if (1 == 1) {
            throw new LoginException("无法登录");
        }else{
            System.out.println("登录成功");
        }
    }

    @RequestMapping("/test02")
    public void test02() {
        if (1 == 1) {
            throw new PermissionException("权限不足");
        }else{
            System.out.println("您拥有权限");
        }
    }


    /**
     * 登录页面
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() {
        System.out.println("登录");
        return "login";
    }

    /**
     * 权限不足页面
     */
    @RequestMapping(value = "/permission", method = RequestMethod.GET)
    public String permission() {
        System.out.println("权限不足页面");
        return "permission";
    }

    /**
     * 全局异常页面
     */
    @RequestMapping(value = "/global_err", method = RequestMethod.GET)
    public String global_err() {
        System.out.println("全局异常页面");
        return "global_err";
    }
}

解释:

1、我们访问测试方法,然后故意抛出异常,来查看结果:

throw new LoginException("无法登录");

结果:

截图-1580713408

本节阅读完毕! (分享
二维码图片 扫描关注我们哟