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>

相关推荐
陌殇殇9 小时前
001 Spring AI Alibaba框架整合百炼大模型平台 — 快速入门
人工智能·spring boot·ai
言慢行善9 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
专吃海绵宝宝菠萝屋的派大星10 小时前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟10 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z10 小时前
常见的限流算法和实现原理
java·开发语言
凭君语未可10 小时前
Java 中的实现类是什么
java·开发语言
He少年10 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
克里斯蒂亚诺更新10 小时前
myeclipse的pojie
java·ide·myeclipse
迷藏49410 小时前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构