广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot使用ExceptionHandler做异常处理
  • 698
分享到

SpringBoot使用ExceptionHandler做异常处理

2024-04-02 19:04:59 698人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

应用程序在运行过程中,会有大量需要处理的异常。在页面解析的一个工程中,会存在多个service类同时出现页面解析异常和解析结果入库异常,而这就表示在程序中需要一个机制,去统一处理这些

应用程序在运行过程中,会有大量需要处理的异常。在页面解析的一个工程中,会存在多个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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot使用ExceptionHandler做异常处理

本文链接: https://www.lsjlt.com/news/129344.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • SpringBoot使用ExceptionHandler做异常处理
    应用程序在运行过程中,会有大量需要处理的异常。在页面解析的一个工程中,会存在多个service类同时出现页面解析异常和解析结果入库异常,而这就表示在程序中需要一个机制,去统一处理这些...
    99+
    2022-11-12
  • SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解
    目录前言自定义error页面@ExceptionHandler注解@ControllerAdvice注解前言 如果能将所有类型的异常处理从各层中解耦出来,则既保证了相关处理过程的功能...
    99+
    2022-11-13
    SpringBoot @ExceptionHandler SpringBoot @ControllerAdvice SpringBoot 异常处理
  • 如何使用SpringBoot处理全局异常
    如何使用SpringBoot处理全局异常 使用@ControllerAdvice 和 @ExceptionHandler处理全局异常 参考: @ControllerAdvice@ResponseBod...
    99+
    2023-10-27
    spring boot java 后端 异常处理
  • SpringBoot全局异常处理 | Java
    ⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言...
    99+
    2023-10-12
    java spring boot 后端
  • Java Springboot全局异常处理
    目录前言一、思路?二、步骤1.自定义接口:2.自定义错误枚举3.自定义异常类4.异常捕获5.在代码中抛异常总结前言 对于作为菜鸟程序员的我来说,经常在controller使用try-...
    99+
    2022-11-12
  • Springboot处理异常的常见方式
    目录一、制造异常二、统一异常处理三、特殊异常处理四、自定义异常处理一、制造异常 报500错误。在大量的代码中很难找到错误 二、统一异常处理 添加异常处理方法 GlobalEx...
    99+
    2022-11-12
  • SpringBoot异常处理的原理分析
    这篇文章主要介绍“SpringBoot异常处理的原理分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot异常处理的原理分析”文章能帮助大家解决问题。异常处理流程执行目标方法,目标方...
    99+
    2023-06-08
  • 怎么在Springboot中处理异常
    这篇文章将为大家详细讲解有关怎么在Springboot中处理异常,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、制造异常报500错误。在大量的代码中很难找到错误二、统一异常处理添加异常处理...
    99+
    2023-06-15
  • SpringBoot全局异常处理方式
    目录SpringBoot全局异常处理springboot全局异常处理——@ControllerAdvice+ExceptionHandler一、全局捕获异常后,返回json给浏览器二...
    99+
    2022-11-12
  • SpringBoot统一异常处理详解
    文章目录 一、概述1、统一异常处理介绍2、原理和目标 二、Assert(断言)1、概述2、Assert自定义实战2.1 自定义接口Assert2.2 自定义异常2.3 Enum整合2.4 ...
    99+
    2023-09-02
    spring boot java spring
  • springboot全局异常处理详解
    一、单个controller范围的异常处理package com.xxx.secondboot.web;import org.springframework.web.bind.annotation.ExceptionHandler;impo...
    99+
    2023-05-31
    spring boot 全局异常
  • SpringBoot异常处理之异常显示的页面问题
    目录导言实现步骤加入thymeleaf依赖然后创建controller使用X进行模糊匹配统一错误页面显示导言 默认情况下,SpringBoot 项目错误页面如下: 直接这样太丑了...
    99+
    2022-11-13
  • SpringBoot Security的自定义异常处理
    目录SpringBoot Security自定义异常access_denied 方面异常Invalid access token 方面异常Bad credentials 方面异常(登...
    99+
    2022-11-12
  • springboot处理异常的5种方式
    目录1、自定义错误页面2、@ExceptionHandle 注解处理异常3、@ControllerAdvice+@ExceptionHandler 注解处理异常4、配置 Simple...
    99+
    2022-11-13
    springboot处理异常 springboot 异常
  • SpringBoot中异常处理实战记录
    目录一、背景二、需求三、编写一些异常基础代码四、注意事项五、总结六、代码实现七、参考文档一、背景 在我们编写程序的过程中,程序中可能随时发生各种异常,那么我们如何优雅的处理各种异常呢...
    99+
    2022-11-13
  • SpringBoot中异常处理实例分析
    这篇文章主要介绍“SpringBoot中异常处理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot中异常处理实例分析”文章能帮助大家解决问题。一、背景在我们编写程序的过程中,...
    99+
    2023-06-30
  • 详解SpringBoot异常处理流程及原理
    异常处理流程 执行目标方法,目标方法运行期间有任何异常都会被catch捕获,并标志当前请求结束,dispatchException抛出异常 进入视图解析流程,并渲染页面,发生异常时...
    99+
    2022-11-12
  • SpringBoot配置全局异常处理器捕获异常详解
    目录1.前言2.全局异常并处理的方法一(@ControllerAdvice 和 @ExceptionHandler)3.全局异常并处理的方法二 (AOP)总结1.前言 任何系统,我们...
    99+
    2023-05-14
    spring boot全局异常处理 springboot捕获异常 springboot异常处理机制
  • springboot实现全局异常处理及自定义异常类
    目录全局异常处理及自定义异常类全局异常处理定义一个业务异常的枚举全局异常处理配置springboot Restful使用springboot 返回 ModelAndView全局异常处...
    99+
    2022-11-13
  • SpringBoot怎么配置全局异常处理器捕获异常
    本篇内容主要讲解“SpringBoot怎么配置全局异常处理器捕获异常”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么配置全局异常处理器捕获异常”吧!1.前言任何系统,我们不...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作