gpt4 book ai didi

java - 如何正确使用 guava Closer

转载 作者:行者123 更新时间:2023-11-29 08:41:46 32 4
gpt4 key购买 nike

我正在努力弄清楚如何使用 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com