在没有 try/catch 的情况下处理异常
Handle exception without try/catch
我有一个方法,抛出的异常必须由调用者处理,而不是由方法本身处理(异常在签名中指定,而不是在正文中指定)。
但是,如果发生不好的事情,我想在调用者必须处理问题之前使用类似于 finally
语句的东西来关闭我的 reader。
在当前配置中,如果触发异常,reader保持打开状态。
private static void executeFile(Connection c, String fileName) throws SQLException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), Charset.defaultCharset())); // $JL-I18N$
/*
Lot of stuff happen here, and might trigger exceptions
*/
reader.close();
}
有办法处理这种情况吗?还是应该重构该方法以自行处理异常?
编辑
评论中提供了一些很好的提示。考虑到这一点,我最终选择的解决方案是提取触发警告的代码并使用 try-with-resources。
你就是这样做的。使用 try-with-resources.
private static void executeFile(Connection c, String fileName)
throws SQLException, IOException {
try (InputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr)) {
/* Lots of stuff */
}
}
try 块中抛出的异常将被传播,reader 堆栈将被关闭。如果(假设地)try-with-resource 执行的隐式 close()
是抛出异常:
- 如果另一个异常已经在传播,它将被抑制,
- 否则会被传播。
注意我重写了`
new InputStreamReader(is, Charset.defaultCharset())
作为
new InputStreamReader(is)
因为它们是等效的:检查 javadoc。另一个重写只是为了可读性,尽管它确实说明 try-with-resources 可以管理多个资源。
我有一个方法,抛出的异常必须由调用者处理,而不是由方法本身处理(异常在签名中指定,而不是在正文中指定)。
但是,如果发生不好的事情,我想在调用者必须处理问题之前使用类似于 finally
语句的东西来关闭我的 reader。
在当前配置中,如果触发异常,reader保持打开状态。
private static void executeFile(Connection c, String fileName) throws SQLException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), Charset.defaultCharset())); // $JL-I18N$
/*
Lot of stuff happen here, and might trigger exceptions
*/
reader.close();
}
有办法处理这种情况吗?还是应该重构该方法以自行处理异常?
编辑
评论中提供了一些很好的提示。考虑到这一点,我最终选择的解决方案是提取触发警告的代码并使用 try-with-resources。
你就是这样做的。使用 try-with-resources.
private static void executeFile(Connection c, String fileName)
throws SQLException, IOException {
try (InputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr)) {
/* Lots of stuff */
}
}
try 块中抛出的异常将被传播,reader 堆栈将被关闭。如果(假设地)try-with-resource 执行的隐式 close()
是抛出异常:
- 如果另一个异常已经在传播,它将被抑制,
- 否则会被传播。
注意我重写了`
new InputStreamReader(is, Charset.defaultCharset())
作为
new InputStreamReader(is)
因为它们是等效的:检查 javadoc。另一个重写只是为了可读性,尽管它确实说明 try-with-resources 可以管理多个资源。