我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot使用ExceptionHandler做异常处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot使用ExceptionHandler做异常处理

应用程序在运行过程中,会有大量需要处理的异常。在页面解析的一个工程中,会存在多个service类同时出现页面解析异常和解析结果入库异常,而这就表示在程序中需要一个机制,去统一处理这些异常,提供统一的异常处理。因为我设计这个结构的主要目的是为了简化代码。

在探寻spring的异常处理机制的时候,主要有三种方式来统一处理异常。三种方式都是使用的@ExceptionHandler注解。

@ExceptionHandler注解解释:
当一个Controller中有方法加了@ExceptionHandler之后,这个Controller其他方法中没有捕获的异常就会以参数的形式传入加了@ExceptionHandler注解的那个方法中。

三种方式都需要首先为自己的系统设计一个自定义的异常类,通过它来传递状态码,以及一些其他参数信息。


public class ProcessException extends RuntimeException {
 
    private static final long serialVersionUID = 1L;
 
    // 任务明细ID
    protected String rwmxid;
 
    public ProcessException(String rwmxid) {
        this.rwmxid = rwmxid;
    }
 
    public String getRwmxid() {
        return rwmxid;
    }
 
    public void setRwmxid(String rwmxid) {
        this.rwmxid = rwmxid;
    }
    
}

第一种思路,设计一个基类。类中使用@ExceptionHandler注解 表明要做异常处理的方法



public class BaseController {
    
    @ExceptionHandler
    @ResponseBody
    public Object expHandler(Exception e){
        if(e instanceof SystemException){
            SystemException ex= (SystemException) e;
            return WebResult.buildResult().status(ex.getCode())
                            .msg(ex.getMessage());
        }else{
            e.printStackTrace();
            return WebResult.buildResult().status(Config.FAIL)
                            .msg("系统错误");
        }
    }
}

这种方式的缺点为:之后所有需要异常处理的Controller都继承这个类,从而获取到异常处理的方法。

虽然这种方式可以解决问题,但是极其不灵活,因为动用了继承机制就只为获取一个默认的方法,这显然是不好的。

第二种方式,将这个基类变为接口,提供此方法的默认实现(也就是接口中的default方法,java8开始支持接口方法的默认实现)



public interface DataExceptionSolver {
    @ExceptionHandler
    @ResponseBody
    default Object exceptionHandler(Exception e){
        try {
            throw e;
        } catch (SystemException systemException) {
            systemException.printStackTrace();
            return WebResult.buildResult().status(systemException.getCode())
                    .msg(systemException.getMessage());
        } catch (Exception e1){
            e1.printStackTrace();
            return WebResult.buildResult().status(Config.FAIL)
                    .msg("系统错误");
        }
    }
}

这种方式虽然没有占用继承,但是也不是很优雅,因为几乎所有的Controller都需要进行异常处理,于是我每个Controller都需要去写implement DataExceptionSolver,这显然不是我真正想要的。况且这种方式依赖java8才有的语法,这是一个很大的局限。

第三种方式,使用加强Controller做全局异常处理。

所谓加强Controller就是@ControllerAdvice注解,有这个注解的类中的方法的某些注解会应用到所有的Controller里,其中就包括@ExceptionHandler注解。
于是可以写一个全局的异常处理类:



@ControllerAdvice
public class ExceptionHandle {
    private final Logger log = LoggerFactory.getLogger(getClass());
 
   @ExceptionHandler(ParseException.class)
   public void parseException(ParseException ex) {
       ex.printStackTrace();
       log.error("parseException ",ExceptionUtil.getMessage(ex));
 
       Map<String,Object> paraMap = new HashMap<String,Object>();
       paraMap.put("rwmxid", ex.getRwmxid());
       CommonUtil.updateDataLog(paraMap);
   }
   
 
   @ExceptionHandler(ProcessException.class)
   public void processException(ProcessException ex) {
       ex.printStackTrace();
       log.error("ProcessException ",ExceptionUtil.getMessage(ex));
 
       Map<String,Object> paraMap = new HashMap<String,Object>();
       paraMap.put("rwmxid", ex.getRwmxid());
       CommonUtil.updateDataLog(paraMap);
   }
   
 
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public TransEntity<?> error(Exception ex) {
        ex.printStackTrace();
        log.error("Exception ",ExceptionUtil.getMessage(ex));
        
        return TransEntity.error();
    }
    
}

如此,我们现在的Controller中的方法就可以很简洁了:



@RestController
@RequestMapping("passport")
public class PassportController {
    PassportService passportService;
        @RequestMapping("login")
    public Object doLogin(HttpSession session, String username, String password){
        User user = passportService.doLogin(username, password);
        session.setAttribute("user", user);
        return WebResult.buildResult().redirectUrl("/student/index");
    }
}

在passprotService的doLogin方法中,可能会抛出用户名或密码错误等异常,然后就会交由ExceptionHandle 去处理,直接返回异常信息给前端,然后前端也不需要关心是否返回了异常,因为这些都已经定义好了。 

如果我们自定义了异常,也可以在指定抛出我们自定义的异常,然后在全局异常处理类中进行处理, @ExceptionHandler(ParseException.class) 表明,会处理抛出的 ParseException 异常。

到此这篇关于SpringBoot使用ExceptionHandler做异常处理的文章就介绍到这了,更多相关SpringBoot使用ExceptionHandler内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot使用ExceptionHandler做异常处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解

在SpringBoot应用的开发中,不管是对底层数据库操作,对业务层操作,还是对控制层操作,都会不可避免的遇到各种可预知的,不可预知的异常需要处理,如果每个处理过程都单独处理异常,那么系统的代码耦合度会很高,工作量大且不好统一,以后维护的工作量也很大
2022-11-13

PHP异常处理:使用Middleware异常处理中间件

php 异常处理使用 middleware 异常处理中间件,允许在应用程序的任何层处理异常,无需在每个控制器中显式处理。步骤如下:安装 symfony/error-handler 库。创建一个实现 middleware 接口的中间件类。在应
PHP异常处理:使用Middleware异常处理中间件
2024-05-14

SpringBoot异常处理的原理分析

这篇文章主要介绍“SpringBoot异常处理的原理分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot异常处理的原理分析”文章能帮助大家解决问题。异常处理流程执行目标方法,目标方
2023-06-08

怎么在Springboot中处理异常

这篇文章将为大家详细讲解有关怎么在Springboot中处理异常,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、制造异常报500错误。在大量的代码中很难找到错误二、统一异常处理添加异常处理
2023-06-15

springboot全局异常处理详解

一、单个controller范围的异常处理package com.xxx.secondboot.web;import org.springframework.web.bind.annotation.ExceptionHandler;impo
2023-05-31

SpringBoot中异常处理实例分析

这篇文章主要介绍“SpringBoot中异常处理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot中异常处理实例分析”文章能帮助大家解决问题。一、背景在我们编写程序的过程中,
2023-06-30

springboot处理异常的5种方式

本文主要介绍了springboot处理异常的5种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

C#中如何使用异常策略处理异常

C#中如何使用异常策略处理异常,需要具体代码示例在C#开发中,异常处理是一项非常重要的任务。合理的异常处理可以提高程序的健壮性和可维护性,同时也能够帮助我们更好地追踪和修复bug。本文将介绍C#中如何使用异常策略来处理异常,并给出具体的代码
2023-10-22

Java异常处理如何使用

这篇文章主要介绍了Java异常处理如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java异常处理如何使用文章都会有所收获,下面我们一起来看看吧。概念异常处理的概念起源于早期的编程语言,如 LISP、PL
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录