• [springMVC学习]12、异常处理


    目录

    简介

    局部异常

    全局异常

    自定义异常

    SimpleMappingExceptionResolver异常统一处理

    异常处理顺序

    总结


    简介

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


    局部异常

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

    1. @RequestMapping("/f1")
    2. public String f1() {
    3. int a = 1 / 0;
    4. return "success";
    5. }

            看一下前端显示页面

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

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

             创建一个错误提示页面

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>异常title>
    5. head>
    6. <body>
    7. <h1>发生异常啦h1>
    8. <p>异常信息是:${message}p>
    9. body>
    10. html>

             再次访问,查看信息

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


    全局异常

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

    1. @ControllerAdvice
    2. public class GlobalException {
    3. //捕获类型转换异常
    4. @ExceptionHandler({NumberFormatException.class})
    5. public String f(Exception e, HttpServletRequest request) {
    6. request.setAttribute("message", e.getMessage());
    7. return "fail_exception";
    8. }
    9. }

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

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

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

     

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


    自定义异常

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

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

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

            下面创建一个handler进行测试

    1. @RequestMapping("/f3")
    2. public String f3() {
    3. if (1 > 0) {
    4. throw new AgeException();
    5. }
    6. return "success";
    7. }

            前端页面显示如下


     SimpleMappingExceptionResolver异常统一处理

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

    1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    2. <property name="exceptionMappings">
    3. <props>
    4. <prop key="java.lang.RuntimeException">fail_exceptionprop>
    5. <prop key="java.lang.ClassCastException">fail_exceptionprop>
    6. props>
    7. property>
    8. bean>

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


    异常处理顺序

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


    总结

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

  • 相关阅读:
    AI写作生成器-人工智能技术的工具
    nginx得if语句内proxy_pass不允许携带url部分,如何处理
    深度学习笔记之线性代数
    SecXOps 核心技术能力划分
    Eolink是国产API接口管理的无冕之王
    pH值、EC控制器
    基于SSM的视频播放系统的设计与实现
    十一 数据库系统
    C++---哈希
    【软考学习14】绝对路径和相对路径的区别和联系
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/126089706