在SpringMVC 中的异常处理....(包含局部异常、全局异常、自定义异常、SimpleMappingExceptionResolver...

在SpringMVC中 异常处理...

  • 基本介绍

1.SpringMVC 通过 HandlerExceptionResolver  处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。

2.主要处理Handler 中用 @ExceptionHandler 注解定义的方法.

3.ExceptionHandlerMethodResolver 内部若是找不到 @ExceptionHandler 注解的话,会找 @ControllerAdvice 类的 @ExceptionHandler 注解方法,这样就相当于一个全局处理器。

局部异常...

  • 代码演示...

1.前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>

<h1>测试异常</h1>
<h3><a href="<%=request.getContextPath()%>/testException01?num=2">点击测试局部异常</a></h3>
</body>
</html>

2.局部处理异常页...

@Controller
public class MyExceptionHandler {

    /**
     *1、localException 方法处理局部异常
     *2、这里处理的异常是:ArithmeticException、NullPointerException
     *3、Exception ex:生成的异常对象,会传递给ex,通过ex可以得到相关信息,
     *   这里程序员也可以加入自己的业务逻辑
     * @param ex
     * @param request
     * @return
     */
    @ExceptionHandler({ArithmeticException.class,NullPointerException.class})

    public String localException(Exception ex, HttpServletRequest request){
        System.out.println("异常信息是--" + ex.getMessage());
        //将异常信息带到下一个页面
        //可以根据自己的要求进行更改
        request.setAttribute("reason",ex.getMessage());
        return "exception_mes";
    }

      //该方法是用来进行相关测试。
     @RequestMapping(value = "/testException01")
        public String test01(Integer num){
            int i = 9/num;
            return "success";
    }
}

3.解释:通过  @ExceptionHandler  该注解中定义的,可以将捕获到 test01()所反馈的异常信息

若是处理的异常存在则返回客户端准备的失败  exception_mes.jsp页面。

全局异常处理...

1.全局异常类的处理需要在添加  @ControllerAdvice 进行注解,当加入该注解后就表示是一个全局处理的异常。

2.全局异常不管哪个 Handler 抛出的异常都能进行捕获。

案例:

前端页面也可以使用局部异常的前端页面中添加相关代码。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>

<h1>测试异常</h1>
<h3><a href="<%=request.getContextPath()%>/testException01?num=2">点击测试局部异常</a></h3>
<h3><a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a></h3>
</body>
</html>

在类中使用 @ControllerAdvice注解 进行注释,表示该类是一个全局异常处理类。

mport org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @ControllerAdvice  全局异常处理器
 */

@ControllerAdvice
public class MyGlobalException {


    //全局异常就不管是哪个 Handler 抛出的异常,都可以捕获
    @ExceptionHandler({NumberFormatException.class,ClassCastException.class,NumberFormatException.class})
    public String localException(Exception ex, HttpServletRequest request){
        System.out.println("全局信息异常= " + ex.getMessage());
        //将异常信息带到下一个页面
        request.setAttribute("reason",ex.getMessage());
        return "exception_mes";
    }

    @RequestMapping(value="/testGlobalException")
    public String global(){

        int num = Integer.parseInt("hello");
        return "success";
    }
}

解读:

模拟 NumberFormatException,在上面的局部异常处理方法中  @ExceptionHandler  没有定义该异常信息。所以此时该异常就会去到全局异常中去寻找该异常。

自定义异常...

1.通过 @ResponseStatus 注解,可以进行自定义异常处理。

代码案例:(以先前 前端页面代码为例)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>

<h1>测试异常</h1>
<h3><a href="<%=request.getContextPath()%>/testException01?num=2">点击测试局部异常</a></h3>
<h3><a href="<%=request.getContextPath()%>/testG">点击测试全局异常</a></h3><br/>
<h3><a href="<%=request.getContextPath()%>/testException02">则是自定义异常</a></h3><br/>
</body>
</html>

抛出自定义异常方法所在的公共类...

@Controller
public class MyExceptionHandler {

    @ExceptionHandler({ArithmeticException.class,NullPointerException.class})
    public String localException(Exception ex, HttpServletRequest request){
        System.out.println("异常信息是--" + ex.getMessage());
        //将异常信息带到下一个页面
        //可以根据自己的要求进行更改
        request.setAttribute("reason",ex.getMessage());
        return "exception_mes";
    }

    @RequestMapping(value = "/testException01")
    public String test01(Integer num){
        int i = 9/num;
        return "success";
    }

    @RequestMapping(value = "/testException02")
    public String test02(){
        //这里可以使用到带参构造器进行遗产信息的返回。
        throw new AgeException("年龄必须要在1-120线之间");
    }
}

自定义异常的异常处理类。

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * 通过 @ResponseStatus 注解来标注的一个异常类
 */
@ResponseStatus(reason = "年龄必须在1-120之间",value = HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException{
    //无参构造器
    public AgeException() {
    }
    //属性构造器
    public AgeException(String message) {
        super(message);
    }
}

注解:在异常方法中我们已经异常抛出去 ,在专门处理异常的类中进行对异常的捕获,再将异常信息传送回前端页面,如下图:

 SimpleMappingExceptionResolver 对所有异常的统一处理!!

  • 基本说明

1.如果希望对所有的异常进行统一处理,可以使用  SimpleMappingExceptionResolver..

2.它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常

3.需要在Spring的ioc容器中进行配置。

下面 ’傻鱼‘ 就和大家开始为大家进行演示!!!

代码演示:

1.首先设计出一条需要处理的异常信息(数组越界异常)。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class MyExceptionHandler {

    @RequestMapping (value = "/testException03")
    public String test03(){
        int[] ints = new int[]{1,2,34,5};
        System.out.println(ints[90]);
        return "success";
    }
}

2.在Spring的ioc文件中配置 SimpleMappingExceptionResolver  

<!--配置统一处理异常信息-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--这句话指定需要处理的异常信息,,,arrEx需要返回的处理页面-->
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
            </props>
        </property>
    </bean>

这句话指定需要处理的异常信息,arrEx.jsp 需要返回的处理页面。。也可以直接挂异常的父类

Exception 这样就会将所有的异常进行捕获!!
<prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop> 

3.异常出现后返回的异常页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>未知异常信息</title>
</head>
<body>
<h1>朋友,系统发生了未知异常~请联系网站管理者 -傻鱼辣椒-</h1>
</body>
</html>

异常处理的优先级....

局部异常   >   全局异常    >    SimpleMappingExceptionResolver    >    tomcat默认机制

你若自己足够努力,神明都会庇佑于你。

  • 43
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻鱼辣椒️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值