SpringBoot全局异常处理

简介: 在开发软件系统过程中,异常信息是常见的,如何处理系统内部异常,快速定位BUG,是非常考验一位软件开发人员的功底。在软件系统开发过程中,统一自定义异常信息,统一对异常进行捕获处理,这样做能提高软件开发效率,并且使代码看起来更优雅。

在开发软件系统过程中,异常信息是常见的,如何处理系统内部异常,快速定位BUG,是非常考验一位软件开发人员的功底。在软件系统开发过程中,统一自定义异常信息,统一对异常进行捕获处理,这样做能提高软件开发效率,并且使代码看起来更优雅。

一、JAVA中的异常

在Java语言中关于异常的类图如下:

(一)error

是指程序无法处理的错误,表示应用程序运行时出现的重大错误。
例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误

(二)Exception

  1. 运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
  2. 编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,使用try......catch进行处理或者throw 到上层,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。
  3. java处理异常的机制:抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的

二、spring全局处理异常

(一)自定义异常

/*** @description: 自定义异常类*/publicclassBizExceptionextendsRuntimeException{
privatestaticfinallongserialVersionUID=1L;
/*** 错误码*/protectedStringerrorCode;
/*** 错误信息*/protectedStringerrorMsg;
publicBizException() {
super();
    }
publicBizException(BaseErrorInfoInterfaceerrorInfoInterface) {
super(errorInfoInterface.getResultCode());
this.errorCode=errorInfoInterface.getResultCode();
this.errorMsg=errorInfoInterface.getResultMsg();
    }
publicBizException(BaseErrorInfoInterfaceerrorInfoInterface, Throwablecause) {
super(errorInfoInterface.getResultCode(), cause);
this.errorCode=errorInfoInterface.getResultCode();
this.errorMsg=errorInfoInterface.getResultMsg();
    }
publicBizException(StringerrorMsg) {
super(errorMsg);
this.errorMsg=errorMsg;
    }
publicBizException(StringerrorCode, StringerrorMsg) {
super(errorCode);
this.errorCode=errorCode;
this.errorMsg=errorMsg;
    }
publicBizException(StringerrorCode, StringerrorMsg, Throwablecause) {
super(errorCode, cause);
this.errorCode=errorCode;
this.errorMsg=errorMsg;
    }
publicStringgetErrorCode() {
returnerrorCode;
    }
publicvoidsetErrorCode(StringerrorCode) {
this.errorCode=errorCode;
    }
publicStringgetErrorMsg() {
returnerrorMsg;
    }
publicvoidsetErrorMsg(StringerrorMsg) {
this.errorMsg=errorMsg;
    }
@OverridepublicThrowablefillInStackTrace() {
returnthis;
    }
}



(二)统一的返回对象

publicclassResultResponse<T> {
/*** 响应代码*/privateStringcode;
/*** 响应消息*/privateStringmessage;
/*** 响应结果*/privateTdata;
publicResultResponse() {
    }
publicResultResponse(BaseErrorInfoInterfaceerrorInfo) {
this.code=errorInfo.getResultCode();
this.message=errorInfo.getResultMsg();
    }
publicStringgetCode() {
returncode;
    }
publicvoidsetCode(Stringcode) {
this.code=code;
    }
publicStringgetMessage() {
returnmessage;
    }
publicvoidsetMessage(Stringmessage) {
this.message=message;
    }
publicTgetResult() {
returndata;
    }
publicvoidsetData(Tresult) {
this.data=result;
    }
/*** 成功** @return*/publicstaticResultResponsesuccess() {
returnsuccess(null);
    }
/*** 成功* @param data* @return*/publicstaticResultResponsesuccess(Tdata) {
ResultResponserb=newResultResponse();
rb.setCode(ExceptionEnum.SUCCESS.getResultCode());
rb.setMessage(ExceptionEnum.SUCCESS.getResultMsg());
rb.setData(data);
returnrb;
    }
/*** 失败*/publicstaticResultResponseerror(BaseErrorInfoInterfaceerrorInfo) {
ResultResponserb=newResultResponse();
rb.setCode(errorInfo.getResultCode());
rb.setMessage(errorInfo.getResultMsg());
rb.setData(null);
returnrb;
    }
/*** 失败*/publicstaticResultResponseerror(Stringcode, Stringmessage) {
ResultResponserb=newResultResponse();
rb.setCode(code);
rb.setMessage(message);
rb.setData(null);
returnrb;
    }
/*** 失败*/publicstaticResultResponseerror( Stringmessage) {
ResultResponserb=newResultResponse();
rb.setCode("-1");
rb.setMessage(message);
rb.setData(null);
returnrb;
    }
@OverridepublicStringtoString() {
returnJSONObject.toJSONString(this);
    }
}



(三)定义基础接口

publicinterfaceBaseErrorInfoInterface {
/***  错误码* @return*/StringgetResultCode();
/*** 错误描述* @return*/StringgetResultMsg();
}



(四)定义枚举类

/*** @description: 异常处理枚举类*/publicenumExceptionEnumimplementsBaseErrorInfoInterface{
// 数据操作错误定义SUCCESS("200", "成功!"),
BODY_NOT_MATCH("400","请求的数据格式不符!"),
RES_NOT_FOUND("404", "未找到该资源!"),
INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),
/*** 错误码*/privatefinalStringresultCode;
/*** 错误描述*/privatefinalStringresultMsg;
ExceptionEnum(StringresultCode, StringresultMsg) {
this.resultCode=resultCode;
this.resultMsg=resultMsg;
    }
@OverridepublicStringgetResultCode() {
returnresultCode;
    }
@OverridepublicStringgetResultMsg() {
returnresultMsg;
    }
}


(五)自定义全局异常处理

在异常处理类上使用@RestControllerAdvice注解,表明此类是springBoot的全局异常处理类,所有的异常都有此类进行处理,并返回异常信息。

/*** @description: 自定义异常处理*/@RestControllerAdvicepublicclassGlobalExceptionHandler {
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);
/*** 处理自定义的业务异常* @param req* @param e* @return*/@ExceptionHandler(value=BizException.class)
publicResultResponsebizExceptionHandler(HttpServletRequestreq, BizExceptione){
logger.error("发生业务异常!原因是:{}",e.getErrorMsg());
returnResultResponse.error(e.getErrorCode(),e.getErrorMsg());
    }
/*** 处理其他异常* @param req* @param e* @return*/@ExceptionHandler(value=Exception.class)
publicResultResponseexceptionHandler(HttpServletRequestreq, Exceptione){
logger.error("未知异常!原因是:",e);
returnResultResponse.error(ExceptionEnum.INTERNAL_SERVER_ERROR);
    }
}


三、总结

合理的异常处理,能够减少代码的重复度和复杂度,有利于代码的阅读及后期维护,并且能够快速定位到BUG,大大提高业务代码的开发效率。

相关文章
|
1月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
42 1
|
2月前
|
Java API Spring
springBoot:注解&封装类&异常类&登录实现类 (八)
本文介绍了Spring Boot项目中的一些关键代码片段,包括使用`@PathVariable`绑定路径参数、创建封装类Result和异常处理类GlobalException、定义常量接口Constants、自定义异常ServiceException以及实现用户登录功能。通过这些代码,展示了如何构建RESTful API,处理请求参数,统一返回结果格式,以及全局异常处理等核心功能。
|
2月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
280 10
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
134 6
|
4月前
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
1706 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
4月前
|
消息中间件 Java 开发工具
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
|
4月前
|
Java Spring
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
|
4月前
|
Java Spring
【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动
【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动
|
4月前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
4月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
106 0