Springboot项目中使用自定义异常

目录

  • 一,说明
  • 二,异常分类
    • 1,编译时异常
    • 2,运行时异常
  • 二,自定义异常
    • 1,异常定义
    • 2,异常处理
  • 三,测试

一,说明

Exception在Java中位于Java.lang包下,继承于Throwable类,和它同一级的还有Error(错误)。在Java规范中,对非受查异常和受查异常的定义是这样的:

The unchecked exception classes are the run-time exception classes and the error classes.

The checked exception classes are all exception classes other than the unchecked exception
classes. That is, the checked exception classes are Throwable and all its subclasses other
than RuntimeException and its subclasses and Error and its subclasses.

也就是说,除了RuntimeException和其子类,以及error和其子类,其它的所有异常都是checkedException,按照这种逻辑关系,可以对Throwable及其子类进行归类分析
Springboot项目中使用自定义异常_第1张图片

Error和Exception的区别:

  • Exception表示的是异常,异常可以用程序来捕捉,或者优化程序来避免。
  • Error表示恢复不是不可能但很困难的情况下的一种严重问题,不能通过程序来进行错误处理,比如说内存溢出。

二,异常分类

在Java中异常分为编译时异常和运行时异常。

1,编译时异常

编译时异常在代码编写阶段就必须处理,不然程序编译无法通过,例如常见的IOException,该类异常要么throws抛出,要么用try-catch捕获处理

public void read() throws IOException{
	File file = new File("D:\JAVA\test.txt");
	FileReader fileReader = new FileReader(file);
	char[] cbuffer = new char[5];
	int len;
	while((len = fileRader.read(cbuffer))!=-1){
		System.out.println(new String(cbuffer,0,len));
	}
}

2,运行时异常

运行时异常在编译时不会对其进行检查,一般都是要程序员自己考虑可能出现异常的情况,并对其做出处理。常见的运行时异常有ArrayIndexOutOfBoundsException(数组越界异常),NullPointerException(空指针异常)。
Java中出现空指针异常的根本原因是在null对象上调用方法或属性了,例如下面的例子

public void test(){
	String str=null;
	if(str.isEmpty()){	//出现空指针异常
		//业务代码
	}
	
	//修改后的代码如下
	//先判断str是否为空,如果是空,因为是“与”,如果前一个条件为FALSE,整体为FALSE,后面的判断不会再执行
	if(str!=null&&str.isEmpty()){
		//业务代码
	}
}

二,自定义异常

自定义异常通常是先继承一个异常类,比如RuntimeException或者Exception,这里以继承RuntimeException为例

1,异常定义

//定义一个异常,继承RuntimeException,异常中包含状态码和错误信息两个字段
public class ServiceException extends RuntimeException {
     private String code;
     
     public ServiceException(String code,String msg){
         super(msg);//调用父类方法
         this.code=code;
     }
}

2,异常处理

定义返回实体类:

@Data
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class Result {
    private String code;
    private String msg;
    private Object data;
    
    //返回错误信息
    public static Result error(String code,String msg){
        return new Result(code, msg, null);
    }
    //返回简单的错误信息
    public static Result error(){
        return new Result(Constants.CODE_500, "系统错误", null);
    }
}

状态码说明:

public interface Constants {
    String CODE_200 = "200";//成功
    String CODE_401 = "401";//权限不足
    String CODE_400 = "400";//参照错误
    String CODE_500 = "500";//系统错误
    String CODE_600 = "600";//其它业务异常
}

异常处理类:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class TestDemoException {
    /**
     * 如果抛出的是ServiceException异常,则调用该方法,
     * 会将ServiceException异常捕获并返回
     */
    @ExceptionHandler(ServiceException.class)
    @ResponseBody
    public Result handle(ServiceException se) {
        //此处对ServiceException异常进行捕获,并返回,返回对象为定义的Result实体类
        return Result.error(se.getCode(), se.getMessage());
    }
}

@ControllerAdvice的作用包括:1,全局异常处理;2,全局数据绑定;3,全局数据预处理

三,测试

public void test(int a){
	if(a<0){
		throw new ServiceException(Constants.CODE_400,"参数为负数");
	}
}

当参数a小于等于0时,抛出一个ServiceException异常,并指明状态码和异常信息。抛出的该异常会被TestDemoException捕获,并按照定义的实体类Result格式返回的客户端。

你可能感兴趣的:(日积月累,java,开发语言)