java - 如何正确使用 guava Closer

标签 java exception lucene guava

我正在努力弄清楚如何使用 Closer来自 guava 库的实用程序。请看下面的代码。

  • 一件事是,IndexWriter在对象初始化和 close() 时抛出 IOException。因此,finally 和 rethrow block 中的代码带有下划线。
  • 另一个问题是,为什么我必须捕获 Throwable 而不是其他异常类型,并且我是否必须重新抛出错误(我更愿意当场记录这些错误)

`

int getDocumentsCount() {
    Closer closer = Closer.create();
    try {
        IndexWriter iwriter = closer.register(openIndexWriter());
        return iwriter.numDocs();
    } catch (Throwable e) {
        logger.error(e, e);
        return -1;
    } finally {
        closer.close();
    }
}


IndexWriter openIndexWriter() throws IOException {
    return new IndexWriter(directory, analyzer, false,
        IndexWriter.MaxFieldLength.UNLIMITED);
}

`

非常感谢

(坚持使用 Java 6)

最佳答案

来自 Guava's own explanation ,您必须使用Throwable,是的。

这是他们的示例片段:

public void foo() throws IOException {
  Closer closer = Closer.create();
  try {
    InputStream in = closer.register(openInputStream());
    OutputStream out = closer.register(openOutputStream());
    // do stuff with in and out
  } catch (Throwable e) { // must catch Throwable
    throw closer.rethrow(e);
  } finally {
    closer.close();
  }
}

请注意,它们捕获 Throwable 并直接从 Closer 实例重新抛出它。

至于为什么是Throwable而不是IOException或者RuntimeException,是因为Closer 必须知道发生了错误,以便它可以正确关闭资源。一切都只是正确地做事的问题。因此,如果操作不当,它可能会起作用,但不能保证。

不是说如果您的方法可以抛出 MyOwnCheckedException,例如,您必须声明它们:

} catch (Throwable t) {
  throw closer.rethrow(e, MyOwnCheckedException.class);
} finally {
  closer.close();
}

Java 7 示例,用于比较:

public void foo() throws IOException {
  try (InputStream in = openInputStream();
       OutputStream out = openOutputStream();
    // do stuff with in and out
  }
}

如果将 Closer 示例与 Java 7 示例进行比较,您会发现我仍然必须在方法签名中声明 IOException


对于您的情况,这是您必须做的:

int getDocumentsCount() {
  try {
    Closer closer = Closer.create();
    try {
       IndexWriter iwriter = closer.register(openIndexWriter());
      return iwriter.numDocs();
    } catch (Throwable e) {
      closer.rethrow(e);
    } finally {
      closer.close();
    }
  } catch (IOException e) {
    logger.error(e, e);
    return -1;
  }
}

为了避免 try-pyramids,我会执行以下操作:

int getDocumentsCount() {
  try {
    return doGetDocumentsCount();
  } catch (IOException e) {
    logger.error(e, e);
    return -1;
  }
}

int doGetDocumentsCount() throws IOException {
  Closer closer = Closer.create();
  try {
    IndexWriter iwriter = closer.register(openIndexWriter());
    return iwriter.numDocs();
  } catch (Throwable e) {
    closer.rethrow(e);
  } finally {
    closer.close();
  }
}

关于java - 如何正确使用 guava Closer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39658005/

相关文章:

java - 指南针在搜索查询中返回 0 行且包含 “#”(哈希字符)

java - 从 Eclipse 类路径中排除项目引用的传递依赖关系的问题

java - antlr4 - 获取规则上下文的左右兄弟

java - java 最大整数值

java - 使用java代码将多行异常转为单行

linq - 使用 IRavenQueryable 的 RavenDB 全文搜索字典

java - 处理 java.lang.VerifyError

java - struts2不再接受http map参数?

c++ - 无法捕获异常!

c# - 命名迭代器和异常