java 抛出异常到返回值

java 抛出异常到返回值,第1张

java 抛出异常到返回

        抛出异常,想把异常信息返回给前端,便于查看。 这时候,要对异常进行捕获,然后赋值给返回值。        

简易抛出异常代码
    @Transactional
    public Object uploadSqlFile(String sqlStr){
        JSonObject result = new JSonObject();
        try {
            splitExcuteSql(sqlStr);
            result.put("msg", "执行完成");
        }catch (Exception ex){
            if (ex instanceof ExcuteExcption) {
                ExcuteExcption excuteExcption = (ExcuteExcption) ex;
                result.put("msg",excuteExcption.getMessage());
            }else{
                result.put("msg",ex.getMessage());
            }
        }
        return result;
    }

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void splitExcuteSql(String sqlStr) {
        JSonObject result = new JSonObject();
        String[] split = sqlStr.split(";");
        List sqlList = new ArrayList<>(Arrays.asList(split));
        int lastIndex = sqlList.size() - 1;
        String last = sqlList.get(lastIndex);
        if (last.contains("下拉框,树形控件的数据源")) {
            sqlList.remove(lastIndex);
        }
        try {
            for (String sql : ListUtils.emptyIfNull(sqlList)) {
                if (StringUtils.isNotBlank(sql)) {
//                    executeSqls(sql.trim()); // 执行sql
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            String message = e.getMessage();
            if (message.contains("PRIMARY")) {
                message = message + " 主键重复,请增大序列当前值,再进行插入!";
            }
            throw new ExcuteExcption(message);
        }
    }

自定义异常ExcuteExcption
public class ExcuteExcption extends RuntimeException {
    public static final Integer SUCCESS_CODE = 200;
    public static final Integer ERROR_CODE = 500;

    
    private Integer code;

    private Object data;

    public ExcuteExcption(Integer code, String message) {
        this(code, message, null, null);
    }

    public ExcuteExcption(String message) {
        super(message);
    }

    public ExcuteExcption(String message, Throwable cause) {
        super(message, cause);
    }

    public ExcuteExcption(Integer code, String message, Object data, Throwable cause) {
        super(message, cause);
        this.code = code;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public Object getData() {
        return data;
    }
}

这样有异常就可以返回到前端。这样就解决了捕获异常值返回给前端。

不过,这个是执行sql的,如果报错,要进行回滚, 结合《trycatch事务回滚》 

再执行,有抛出异常,但是没有回滚了。

这时候如何处理?

手动回滚,并不管用了。也没想到其它好的方式去处理。

我想到的是,输出异常日志,然后直接返回异常值。后续有想到更好的方式,再优化。

直接返回异常值: 
 private static final Logger LOGGER = LoggerFactory.getLogger(ExcuteSqlService.class);

    @Transactional
    public Object uploadSqlFile(String sqlStr){
        return splitExcuteSql(sqlStr);
    }

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public Object splitExcuteSql(String sqlStr) {
        JSonObject result = new JSonObject();
        String[] split = sqlStr.split(";");
        List sqlList = new ArrayList<>(Arrays.asList(split));

        try {
            for (String sql : ListUtils.emptyIfNull(sqlList)) {
                if (StringUtils.isNotBlank(sql)) {
//                    executeSqls(sql.trim()); // 执行sql
                }
            }
            result.put("msg", "执行完成");
        } catch (Exception e) {
            String message = e.getMessage();
            if (message.contains("PRIMARY")) {
                message = message + " 主键重复,请增大序列当前值,再进行插入!";
            }
            LOGGER.error(message);
            result.put("msg", message);
        }
        return result;
    }

总结:

     捕获异常到返回值,分两步: 1,捕获异常;2,将异常的内容赋值给返回值。 可以弄一个统一的返回值进行处理,其他方法继承调用

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5707953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存