抛出异常,想把异常信息返回给前端,便于查看。 这时候,要对异常进行捕获,然后赋值给返回值。
简易抛出异常代码 @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,将异常的内容赋值给返回值。 可以弄一个统一的返回值进行处理,其他方法继承调用



