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>

相关推荐
魔道不误砍柴功41 分钟前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
失落的香蕉43 分钟前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v44 分钟前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge1 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
路在脚下@1 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet
黑马师兄1 小时前
SpringBoot
java·spring
数据小小爬虫1 小时前
如何用Java爬虫“偷窥”淘宝商品类目API的返回值
java·爬虫·php
暮春二十四1 小时前
关于用postman调用接口成功但是使用Java代码调用却失败的问题
java·测试工具·postman
java小吕布2 小时前
Java中Properties的使用详解
java·开发语言·后端
爱吃土豆的程序员2 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie