1

我必须每月浏览一次包含 150,000 多个项目的集合,并且发生的所有事情大约需要 3 到 4 个小时,这很好。问题是有时一些数据会抛出一个exception(当然,这在我的第一次测试运行中没有发生,直到像项目 148,000 一样)。我只是将它设置为在逻辑上忽略异常(当然记录它),但我意识到我并不总是想简单地忽略异常。

我写了一个简单的异常处理程序,它处理不同类型的异常以及如果发生某种类型的异常该怎么办;例如,如果我得到一个SQLException我会中止这个过程,但NullPointerException我会继续,因为这通常是数据的问题。我还跟踪异常的总数,如果达到预设限制,我也会终止该进程。

所以我的问题是:我将构建更多这样的程序来处理不同类型的数据Collections。是否有处理集合和处理不同类型异常的库?

以下是我根据评论请求添加的一些代码。如果您对自己说:“好吧,这就是您想要它做的事情,问题是什么?”,您是对的。但是我想知道是否存在一个库,可以让我注册异常以及遇到时该怎么办。比如我想在发生A或D类型的异常时停止处理,当B发生时继续,除非它发生X次,当C发生时继续,除非它发生Y次,完全忽略E。主要是因为我知道我有不同的数据集,collections我和其他人将在未来使用并希望使用一致的东西。

基本代码片段:

exeptionLimit = 50;
exceptionCount = 0;
for (long id : MyCollection)
{
     try
     {
         //All these methods throw the exceptions 
         Item item = getItemById(id);
         NewData data = ProcessItem(item);
         SaveNewData(data);
     }
     catch (SQLException e)
     {
         //log

         throw e; //I want this to cause the process to fail
     }
     catch (NullPointerException e)
     {
          //log
          exceptionCount++;
          if (exceptionCount >= exceptionLimit) throw new Exception("Limit hit!");
     }
}
4

3 回答 3

3

ACollection表示数据的逻辑分组和对数据进行操作的一组函数。
您可以找到提供高级数据结构和更好性能的库,JDK但如果我正确理解了您的问题,您需要了解您想要在集合之上构建的逻辑。
我的意思是,不同类型的异常之间的分离以及它们是否被记录等是您的应用程序逻辑的一部分。
它与提供该功能的集合框架无关。数据的集合和辅助方法

于 2012-05-11T15:35:33.513 回答
2

您可以查看Failsafe。它以富有表现力和简洁的方式处理您的场景:

RetryPolicy retryPolicy = new RetryPolicy()
  .abortOn(SQLException.class)
  .retryOn(NullPointerException.class)
  .withMaxRetries(50);

Connection connection = Failsafe.with(retryPolicy).run(() -> {
  Item item = getItemById(id);
  NewData data = ProcessItem(item);
  SaveNewData(data);
});

没有变得更简单。

于 2016-03-31T05:29:31.553 回答
1

我最终拼凑出自己的解决方案,但最近偶然发现了异步重试模式:

https://github.com/nurkiewicz/async-retry

还有一篇关于它的好文章:

http://nurkiewicz.blogspot.com/2013/07/asynchronous-retry-pattern.html

于 2013-08-06T14:24:57.697 回答