SpringMVC异常处理

一、系统异常处理器

  在mvc配置文件中配置系统异常处理器,用来解决异常处理问题

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="error"/> //异常处理页面
        <property name="exceptionAttribute" value="ex"/> //异常
</bean>

  页面配置:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>//允许使用el表达式
<html>
<head>
    <title>错误页面</title>
</head>
<body>
    发生错误:${ex.message}
</body>
</html>

  模拟错误:

@RequestMapping("/firstRequest")
    public String firstRequest(){
        //模拟异常
        int result=5/0;
        return "index";
    }

二、使用系统异常处理器实现处理自定义异常类

  自定义异常类:

package com.springmvc.exception;

public class AgeException extends Exception{
    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}
package com.springmvc.exception;


public class NameException extends Exception{
    public NameException() {
    }

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

  MVC配置文件配置:

<!--系统异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="error"/>
        <property name="exceptionAttribute" value="ex"/>
       <!--定制异常-->
        <property name="exceptionMappings">
            <props>
                <prop key="com.springmvc.exception.NameException">nameError</prop>
                <prop key="com.springmvc.exception.AgeException">ageError</prop><!--不同的页面-->
</props> </property> </bean>

  页面配置:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Age异常</title>
</head>
<body>
您提交的数据发生了:${ex.message}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Name异常</title>
</head>
<body>
    您提交的数据发生了:${ex.message}
</body>
</html>

  模拟异常:

@RequestMapping("/secondRequest")
    public String secondRequest(String userName,Integer userAge) throws NameException, AgeException {
        if(!userName.equals("admin")){
            //手动创建一个Name异常
            throw  new NameException("名称错误!!!!!!!!");
        }
        if(userAge<0||userAge>80){
            //手动创建一个Age异常
            throw  new AgeException("年龄太大,不符合规定!!!!!!");
        }
        return "index";
    }

三、自定义异常处理器

/**
 * 自定义异常处理器
 */
public class MyHandlerException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView=new ModelAndView();
        //如果发生异常,我们给他一个默认的异常处理页面
        modelAndView.setViewName("error");
        modelAndView.addObject("ex",ex);

        //如果发生Name异常,则跳转到Name异常页面
        if(ex instanceof NameException){
            modelAndView.setViewName("nameError");
        }
        if(ex instanceof AgeException){
            modelAndView.setViewName("ageError");
        }
        return modelAndView;
    }
}

  配置文件中配置:

 <!--将自定义异常处理器注册到Spring容器当中-->
    <bean class="com.springmvc.exception.MyHandlerException"/>

  其余操作和之前一样

四、使用注解处理异常

  4.1使用注解处理局部异常

/**
     * 局部注解处理
     */
@ExceptionHandler
    public ModelAndView exceptionHandler(Exception ex){
        ModelAndView modelAndView=new ModelAndView();
        //如果发生异常,我们给他一个默认的异常处理页面
        modelAndView.setViewName("error");
        modelAndView.addObject("ex",ex);

        //如果发生Name异常,则跳转到Name异常页面
        if(ex instanceof NameException){
            modelAndView.setViewName("nameError");
        }
        if(ex instanceof AgeException){
            modelAndView.setViewName("ageError");
        }
        return modelAndView;
    }

  4.2使用注解处理所有controller异常

/**
 * 要让这个类处理所有Controller的异常
 */
@ControllerAdvice
public class MyControllerAdvice {
    @ExceptionHandler
    public ModelAndView exceptionHandler(Exception ex){
        ModelAndView modelAndView=new ModelAndView();
        //如果发生异常,我们给他一个默认的异常处理页面
        modelAndView.setViewName("error");
        modelAndView.addObject("ex",ex);

        //如果发生Name异常,则跳转到Name异常页面
        if(ex instanceof NameException){
            modelAndView.setViewName("nameError");
        }
        if(ex instanceof AgeException){
            modelAndView.setViewName("ageError");
        }
        return modelAndView;
    }
}
原文地址:https://www.cnblogs.com/F017/p/11839558.html