企业实战之spring项目《自定义异常》

本文介绍了在Spring项目中自定义异常的实践方法,包括异常的层次结构、业务异常的划分以及如何根据业务场景抛出和处理异常。通过继承RuntimeException创建业务异常,并通过全局异常处理器返回对应的HTTP状态码。此外,还提到了使用示例和获取完整源码的方式。
摘要由CSDN通过智能技术生成

前言

在java项目里,异常的使用是比不可少,但是很多的开发者并不知道异常在项目中要怎么使用会更好一些,今天就给大家抛砖引玉下吧,说说项目中我是怎么使用的,也希望能引出你的更好的使用方法和想法。

分析

我们先来说说,目前很多项目都是怎么处理自定义异常的呢?因为项目采用的是基本都是MVC代码组织模式,所以很多的项目会按层次定义自己的异常,例如:DaoException、ServiceException、ControllerException,还有按照第三发组件定义自定义异常,例如:MysqlExceptioin、RedisException、ElasticSearchException,RabbitMqException这样的划分(这里只说下大类的异常划分,详细的就不说了),上述这些异常的划分都是有一些好处的,可以很容易定位到时哪个层或那个组件出现了问题,但是有一点如果你没有对这些功能组件或代码层做二次封装,其实是没有特别的必要这样划分异常的,因为功能组件通常都有一个自己的全局异常类,当出现异常的,其实也一眼就可以定位到这个异常原因,没有必要在不厌其烦的将异常一层层抛出,代码的意义其实不是很大,那么接下来说下我们的异常使用方式。

正题

这里写图片描述
来先让我们熟悉下异常的集成结构,Throwable是所有异常的父类,Error是错误,错误是致命的,所以在程序中我们通常不会碰到Error,也通常不会去自定义实现它,Exception是异常的父类,异常分为两大类,受检异常和运行时异常,受检异常就是在调用某个抛出受检异常方法时,调用方必须去处理掉该异常或手动向上抛出,否则编译不通过,运行时异常就是不会被编译器所检查,当程序运行到特定条件时,才会抛出异常,那么问题来啦,我们自定义的异常,到底是继承Exception(除RuntimeException的子类都是受检异常)还是RuntimeException(运行时异常)呢?我们通常是继承RuntimeException,也建议你也这样做。

下面说下我们的异常继承关系:
这里写图片描述
对于异常我们会划分出参数无效、数据已存在、数据不存在、权限不足、远程调用、内部错误等等的异常他们都继承了全局业务异常(BusinessException),更详细的异常可以通过继承它们去向下划分,你可以看到,其实我们划分的异常是按照业务划分的,接口采用的Restful风格,全局异常捕获类会根据特定的异常,返回不同的HTTP状态码, 例如:参数无效会返回400Http状态码,数据不存在会返回404,系统内部错误返500等等。
下面我们展示一下代码:

业务异常基类,BusinessException:

package com.zhuma.demo.exception;

import com.zhuma.demo.enums.ExceptionEnum;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import com.zhuma.demo.enums.ResultCode;
import org.springframework.core.NestedCheckedException;

/**
 * @desc 业务异常类
 * 
 * @author zhumaer
 * @since 9/18/2017 3:00 PM
 */
@Data
public class BusinessException extends RuntimeException {
   

	private static final long serialVersionUID = 194906846739586856L;

	protected String code;

	protected String message;

	protected ResultCode resultCode;

	protected Object data;

	public BusinessException() {
   
		ExceptionEnum exceptionEnum = ExceptionEnum.getByEClass(this.getClass());
		if (exceptionEnum != null) {
   
			resultCode = exceptionEnum.getResultCode();
			code = exceptionEnum.getResultCode().code().toString();
			message = exceptionEnum.getResultCode().message();
		}

	}

	public BusinessException(String message) {
   
		this();
		this.message = message;
	}

	public BusinessException(String format, Object... objects) {
   
		this();
		format = StringUtils.replace(format, "{}", "%s");
		this
  • 17
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值