[springMVC学习]12、异常处理
  TEZNKK3IfmPf 2023年11月12日 20 0

简介

        在程序运行的过程中,难免会出现异常,如果我们没有做处理,那么前端页面显示的信息就会很不友好。在springMVC中提供了异常处理机制,通过注解就可以设置不同异常发生后,前端显示不同的信息。


局部异常

        下面代码就会产生一个异常

    @RequestMapping("/f1")
    public String f1() {
        int a = 1 / 0;
        return "success";
    }

        看一下前端显示页面

[springMVC学习]12、异常处理

         下面就使用springmvc提供的异常处理来统一进行处理,需要写在当前的类里面

    //改注解value里面写上想要捕获的异常
    @ExceptionHandler({ArithmeticException.class})
    public String handleException(Exception e, HttpServletRequest request) {
        request.setAttribute("message", e.getMessage());
        return "fail_exception";
    }
}

         创建一个错误提示页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常</title>
</head>
<body>
<h1>发生异常啦</h1>
<p>异常信息是:${message}</p>
</body>
</html>

         再次访问,查看信息

[springMVC学习]12、异常处理

        可以发现友好了很多。注意:@ExceptionHandleer只会捕获当前类里面发生的异常,异常信息可以通过参数来进行获取


全局异常

        上面的是局部异常,只能在一个类里面进行生效,下面来介绍全局异常。

@ControllerAdvice
public class GlobalException {

    //捕获类型转换异常
    @ExceptionHandler({NumberFormatException.class})
    public String f(Exception e, HttpServletRequest request) {
        request.setAttribute("message", e.getMessage());
        return "fail_exception";
    }
}

        全局异常我们使用@ControllerAdvice进行标识,然后里面的方法还是用@ExceptionHandler进行标识,在这里的异常处理会对所有的Handler都生效。下面代码会抛出一个异常,看是否能够处理

    @RequestMapping("/f2")
    public String f2() {
        int a = Integer.parseInt("abc");
        return "success";
    }

        前端页面显示如下,可以进行捕获

[springMVC学习]12、异常处理 

        有一点需要注意的是,异常捕获顺序是先在当前类里面标识@ExceptionHandler进行匹配,匹配不上再开始去@ControllerAdvice里面标识@ExceptionHandler进行匹配


自定义异常

        我们还可以使用@ResponseStatus来进行自定义异常的捕获

@ResponseStatus(reason = "年龄必须在18以上...", code = HttpStatus.INTERNAL_SERVER_ERROR)
public class AgeException extends RuntimeException{
}

         上面代码我们定义了一个异常,使用@ResponseStatus进行标识,reason就是标识异常的原因,code就是要返回给前端的状态码。

        下面创建一个handler进行测试

    @RequestMapping("/f3")
    public String f3() {
        if (1 > 0) {
            throw new AgeException();
        }
        return "success";
    }

        前端页面显示如下

[springMVC学习]12、异常处理


 SimpleMappingExceptionResolver异常统一处理

        我们可以直接在配置文件中配置不同的异常要跳转的视图

    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.RuntimeException">fail_exception</prop>
                <prop key="java.lang.ClassCastException">fail_exception</prop>
            </props>
        </property>
    </bean>

         这样配置之后不同的异常将会跳转到不同的视图


异常处理顺序

        异常处理的顺序就是  局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat默认异常处理机制


总结

        异常处理使用比较简单,如果想了解原理,自行debug即可

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   40   0   0 异常C++
  TEZNKK3IfmPf   2023年11月14日   20   0   0 异常java
  TEZNKK3IfmPf   2023年11月14日   17   0   0 异常C++
  TEZNKK3IfmPf   2023年11月14日   25   0   0 异常
  TEZNKK3IfmPf   2023年11月14日   24   0   0 springMVC
  TEZNKK3IfmPf   2023年11月14日   20   0   0 异常java
  TEZNKK3IfmPf   2023年11月14日   30   0   0 springMVCspring
  TEZNKK3IfmPf   2023年11月14日   27   0   0 VS异常调试
  TEZNKK3IfmPf   2023年11月14日   24   0   0 异常
  TEZNKK3IfmPf   2023年11月14日   31   0   0 springMVC
TEZNKK3IfmPf