我们的服务正在调用一个API,该API从数据库中检索数据。让我们这样定义它
公共列表
getData(int id)引发FinderException
看着这个API,我认为当找不到数据时,它将抛出FinderException。所以,我的代码是:-
try{
List<RowData> list = getData(id);
} catch (FinderException e) {
throw new InternalException();
}
return list;
现在,我意识到当找不到数据时,API不会引发FinderException。因此,我客户的代码已损坏。因为我们的API的客户端希望在找不到数据时引发InternalException。现在,他们的代码
list.get(0)
正在崩溃。 现在,我正在考虑将代码更改为:-
try{
List<RowData> list = getData();
if(list.isEmpty()) throw new FinderException()
} catch (FinderException e) {
throw new InternalException();
}
return list;
以相同的方法抛出并捕获的好代码吗?如果没有,为什么。 如何改善我的设计?
答案 0 :(得分:1)
您应该分别处理这两种情况:
``
List<RowData> list;
try {
list = getData();
if(list.isEmpty()) throw new NoItemsFoundException();
// handle this elsewhere, maybe the same place you handle InternalException
} catch (FinderException e) {
throw new InternalException(e.getMessage());
}
return list;
优良作法是将捕获的FinderException的消息传递给重新抛出的InternalException,这样就不会丢失任何信息。