栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spirngboot自定义抛出异常

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spirngboot自定义抛出异常

为什么需要自定义抛出异常?
答:不满足条件的方法应提前终止程序往下执行,节省资源占用。提升程序运行效率。
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就直接拿错误信息了,不用写那么多判断。

Res.java统一返回对象。

public class Res {
    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);
    }

成功就是传什么就是什么。

抛异常就是你定义的异常信息。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/582310.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号