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