使用Java中的相同方法引发并捕获异常

时间:2018-12-11 20:33:47

标签: java oop exception-handling coding-style

我们的服务正在调用一个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;

以相同的方法抛出并捕获的好代码吗?如果没有,为什么。 如何改善我的设计?

1 个答案:

答案 0 :(得分:1)

您应该分别处理这两种情况:

  1. 您的API的FinderException(无论出于何种原因,可能会导致基础服务不可用或其他原因引发)。
  2. 未找到任何项目(建议您创建自己的(内部)NoItemsFoundException或类似的内容)

``

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,这样就不会丢失任何信息。