- 在Java中如何使用好
Exception
是门艺术。
- 一般我们常见的有checked异常(
Exception
)和unchecked异常(RuntimeException
),区别在于前者在语法层面强制开发者对异常进行处理,后者则不用。
- 两种异常的好坏或和使用方式大多还是根据场景而定。
一个现状
- 目前接手了一个项目,此项目定位为基础组件,对外部系统提供REST API服务和对应SDK。
- 其中SDK的大致逻辑为:
//调用rest api
public Result submit(Object args){
Result result;
Request req = createRequest(args); //构造rest请求
try{
result = doRestRequest(req); //请求http
}
catch(Exception e){
result = new Result();
result.code = -1; //发生异常时设置结果码为失败
}
return result;
}
- 逻辑上没有问题,调用失败的场景通过
Result.code
告诉给使用者。
- 从现在分布式微服务应用角度看,远程调用发生错误应该要被认为是一种常态,开发者必须关心发生错误的场景。
- 这样的SDK封装往往会让使用方就会忽略错误的场景,直接提交本地事务完成请求,最终造成业务方与基础组件中的数据状态不一致。
改进
- 这种问题发生太多次了,每次都得事后手动处理。所以在下个版本的SDK中,打算使用
Exception
进行改造。
//调用rest api
public Result submit(Object args) throws Exception{
Request req = createRequest(args); //构造rest请求
try{
return doRestRequest(req); //请求http
}
catch(Exception e){
throw new Exception(e); //此处可以对异常做一个封装
}
}
- 这样至少在代码层面上提示使用方必须处理错误的场景,进行数据回滚和在界面上进行提示。