springboot 自定义异常

为什么需要自定义抛出异常?
答:不满足条件的方法应提前终止程序往下执行,节省资源占用。提升程序运行效率。
spring有全局异常捕获。因此我们可以把自定义异常放到全局异常捕获里面。

Err.java继承RuntimeException

public class Err extends RuntimeException { 
    private boolean success;
    private String data;

    public Err(){ }
    public Err(String data){ 
        this.success = false;
        this.data = data;
    }
	//省略get/set
}

GlobalException.java

@RestControllerAdvice
public class GlobalExceptionHandler{ 
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /** * 打印详细异常日志信息 */
    public static String getExceptionDetail(Exception ex) { 
        String ret = null;
        try { 
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            PrintStream pout = new PrintStream(out);
            ex.printStackTrace(pout);
            ret = new String(out.toByteArray());
            pout.close();
            out.close();
        } catch (Exception e) { 
        }
        return ret;
    }

    /** * 自定义异常 */
    @ExceptionHandler(value =Err.class)
    public Map Err(Err e){ 
    	//不能直接返回Err对象,因为Err对象继承了RuntimeException对象,会把RuntimeException对象里面的变量也返回给前端,所以要写个map装Err对象里面的变量
        Map map = new HashMap();
        map.put("success",false);
        map.put("data",e.getData());
        return map;
    }
    
    /** * 空指针异常 */
    @ExceptionHandler(value =NullPointerException.class)
    public Res exceptionHandler(NullPointerException e){ 
        log.error("空指针异常"+getExceptionDetail(e));
        return new Res(false,"空指针异常");
    }
    
    /** * 其他异常 */
    @ExceptionHandler(value =Exception.class)
    public Res exception(Exception e){ 
        log.error("500异常:"+getExceptionDetail(e));
        return new Res(false,"服务器异常");
    }
}

统一返回对象会提高代码的耦合度。spring提供了全局统一返回处理类,但是对于404这种错误的无法判断。如下图。前端需要判断各种状态码。我个人认为没必要,只需要判断成功或者失败一个即可。如果success是true,data就是数据,success是false,data就是错误信息。这样前端只需要判断success是true就可以直接拿数据,是false就直接拿错误信息了,不用写那么多判断。
《springboot 自定义异常》

Res.java统一返回对象。

public class Res<T> { 
    private boolean success = true;
    private T data;

    public Res(){ }
	
	//正常返回数据
    public Res(T data){ 
        this.data = data;
    }
	
	//全局异常返回,正常返回数据就传true
    public Res(boolean success,T data){ 
        this.success = success;
        this.data = data;
    }
	//省略get/set
}

接下来你可以抛出你定义的Err异常类返回给前端。这里以Controller为例。

	@GetMapping("hello")
    public Res hello(String str){ 
        if ("false".equals(str))throw new Err("自定义异常信息返回。");
        return new Res(str);
    }

成功就是传什么就是什么。
《springboot 自定义异常》
抛异常就是你定义的异常信息。
《springboot 自定义异常》

    原文作者:Meta39
    原文地址: https://blog.csdn.net/weixin_43933728/article/details/121469722
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞