EDUCODER头哥 SpringBoot 异常处理

极速版:

  1. @ExceptionHandle 注解处理异常
java 复制代码
package net.educoder.controller;

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

@Controller
public class Step1Controller {
    /**
     * 模拟 NullPointerException
     *
     * @return
     */
    @RequestMapping("/step1_1")
    public String showInfo() {
        String str = null;
        str.length();
        return "index";
    }

    /**
     * 模拟 ArithmeticException
     *
     * @return
     */
    @RequestMapping("/step1_2")
    public String showInfo2() {
        int a = 10 / 0;
        return "index";
    }


    /********** begin **********/


    /**
     * java.lang.ArithmeticException 异常处理器
     * <p>
     * 需求:
     * 1.捕捉该 Controller 类下的所有算术异常
     * 2.跳转 error1.html 页面
     */
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public String ArithmeticException() {
        return "error1";
    }
   
   


    /**
     * java.lang.NullPointerException 异常处理器
     * <p>
     * 需求:
     * 1.捕捉该 Controller 类下的所有空指针异常
     * 2.跳转 error2.html 页面
     */
    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public String NullPointerException() {
        return "error2";
    }
   
   

    /********** end **********/
}
  1. @ControllerAdvice 注解处理异常
java 复制代码
package net.educoder.conf;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/********** begin **********/

@ControllerAdvice
public class Step2Exception {


    /**
     * 需求:
     * 1.定义全局算术异常处理器,返回格式为:{"msg":"算术异常","code":-1}
     * 2.定义全局空指针异常处理器,返回格式为:{"msg":"空指针异常","code":-2}
     */
    @ResponseBody
    @ExceptionHandler(value = ArithmeticException.class)
    public Map<String, Object> ArithmeticExceptionHandler(Exception ex) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("code", -1);
        map.put("msg", "算术异常");
        return map;
    }
    
    @ResponseBody
    @ExceptionHandler(value = NullPointerException.class)
    public Map<String, Object> NullPointerExceptionHandler(Exception ex) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("code", -2);
        map.put("msg", "空指针异常");
        return map;
    }
   

    /********** end **********/
}
  1. 自定义 HandlerExceptionResolver 类处理异常
java 复制代码
package net.educoder.conf;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class GlobalException implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse
            , Object o, Exception ex) {
        ModelAndView mv = new ModelAndView();

        /**
         * 需求:判断异常类型,如果异常类型为 ArithmeticException 页面跳转到 error1.html ,如果异常类型为 NullPointerException 页面跳转到 error2.html
         */
        /********** begin **********/
        if (ex instanceof ArithmeticException) {
            mv.setViewName("error1");
        }else{
            mv.setViewName("error2");
        }

        /********** end **********/
        return mv;
    }
}

以下是题目

  1. @ExceptionHandle 注解处理异常

任务描述

本关任务:@ExceptionHandle 注解进行异常处理。

相关知识

为了完成本关任务,你需要掌握:如何使用 @ExceptionHandle 注解。

@ExceptionHandle 注解使用

@ExceptionHandle 注解一般在控制层(Controller)下使用,捕捉当前控制层类的异常,针对性较强,范围只限于当前控制层(Controller )。

案例:

@Controller

public class MainController {

@RequestMapping("/index")

public String page() {

String str = "123";

char ch = str.charAt(3);

return "index";

}

@ExceptionHandler(value = {java.lang.IndexOutOfBoundsException.class})

@ResponseBody

public String IndexOutOfBonesExceptionHandler() {

return "IndexOutOfBoundsException";

}

}

效果图:

说明:@ExceptionHandler 在方法上使用,value 的值是异常类型,其方法可以直接返回错误页面,也可以返回 JSON 格式的错误信息。

编程要求

根据提示,在右侧编辑器补充代码,完成算术异常的处理和空指针异常的处理。

测试说明

该实训已经提供了两种异常代码,一种为 NullPointerException ,路由为 step1_1,另一种为 ArithmeticException,路由为 step1_2。

效果图默认访问的是 step1_1 接口,你也可以修改浏览器 URL,将其改为 访问 step1_2 接口。

  1. @ControllerAdvice 注解处理异常

任务描述

本关任务:@ControllerAdvice 注解进行异常处理。

相关知识

为了完成本关任务,你需要掌握:如何@ControllerAdvice 注解进行异常处理。

@ControllerAdvice 注解使用

@ExceptionHandle 放在控制层(Controller)中,这种异常处理耦合性太高了,如果业务增加,就每个控制层类都要来一遍 @ExceptionHandle 。试想下,如果在异常逻辑相同的情况,这种写法肯定不合理,存在大量的重复代码。但是这不是说 @ExceptionHandle 结合控制层类就是错误的,因为这个写法可以单独针对某个控制层类的异常来进行处理。( ̄▽ ̄)/

接下来,介绍下全局异常捕获类咋编写?

别问我,什么叫全局异常捕获(╬ ̄皿 ̄)。字面意思,一个能对所有异常进行处理的类,一个在类上加 @ControllerAdvice 注解的类,对,是一个类。

案例:

控制层异常接口

@Controller

public class DemoController {

@RequestMapping("/test/{id}")

public String test(@PathVariable Integer id) {

if (true) {

id = 1 / id;

}

return "success";

}

}

全局异常处理类

@ControllerAdvice

public class MyControllerAdvice {

@ResponseBody

@ExceptionHandler(value = Exception.class)

public Map<String, Object> exceptionHandler(Exception ex) {

Map<String, Object> map = new HashMap<String, Object>();

map.put("code", 500);

map.put("mag", ex.getMessage());

return map;

}

}

效果图:

编程要求

根据提示,在右侧编辑器补充代码,完成以下需求:

定义全局算术异常处理器,返回格式为:{"msg":"算术异常","code":-1}

定义全局空指针异常处理器,返回格式为:{"msg":"空指针异常","code":-2}

  1. 自定义 HandlerExceptionResolver 类处理异常

任务描述

本关任务:使用自定义 HandlerExceptionResolver 类进行异常处理。

相关知识

为了完成本关任务,你需要掌握:如何使用自定义 HandlerExceptionResolver 类进行异常处理。

自定义 HandlerExceptionResolver

案例:

控制层

@Controller

public class DemoController {

@RequestMapping("/test/{id}")

public String test(@PathVariable Integer id) {

if (true) {

id = 1 / id;

}

return "success";

}

}

全局异常处理类

@Configuration

public class GlobalException implements HandlerExceptionResolver {

@Override

public ModelAndView resolveException(HttpServletRequest httpServletRequest

, HttpServletResponse httpServletResponse

, Object o, Exception ex) {

ModelAndView mv = new ModelAndView();

mv.setViewName("error");

return mv;

}

}

错误页面(error.html)

<!DOCTYPE html>

<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">

<head>

<meta charset="UTF-8">

<title>错误页面</title>

</head>

<body>

<h1>服务器异常,请联系管理员</h1>

</body>

</html>

相关推荐
广州山泉婚姻1 分钟前
解锁高效开发:Spring Boot 3和MyBatis-Flex在智慧零工平台后端的应用实战
人工智能·spring boot·spring
守护者1709 分钟前
JAVA学习-练习试用Java实现“一个词频统计工具 :读取文本文件,统计并输出每个单词的频率”
java·学习
bing_15820 分钟前
Spring Boot 中ConditionalOnClass、ConditionalOnMissingBean 注解详解
java·spring boot·后端
ergdfhgerty22 分钟前
斐讯N1部署Armbian与CasaOS实现远程存储管理
java·docker
勤奋的知更鸟35 分钟前
Java性能测试工具列举
java·开发语言·测试工具
三目君39 分钟前
SpringMVC异步处理Servlet
java·spring·servlet·tomcat·mvc
用户05956611920939 分钟前
Java 基础篇必背综合知识点总结包含新技术应用及实操指南
java·后端
fie888939 分钟前
Spring MVC扩展与SSM框架整合
java·spring·mvc
不太可爱的叶某人1 小时前
【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略
java·笔记·学习
YuTaoShao1 小时前
Java八股文——JVM「类加载篇」
java·开发语言·jvm