你的示例与只有一个外部catch块的类似代码之间的区别:
1)如果内部块抛出异常,则在调用Close()
之前会打印消息。如果Close()
还包含日志记录,则可能很重要。
2)如果抛出并捕获内部异常,然后在finally块中Close()
也抛出异常,则会产生两个异常并处理两个异常。如果只有一个catch块,则如果Close()
抛出异常,则下一步会发生什么可能取决于语言,但您不会收到两个错误消息。我希望第二个异常能够替换第一个异常,但我不保证这是所有语言(甚至是我使用过的所有语言...)中finally
的情况。
3)//显示错误消息
只是一个注释,它什么也不做。作者的意图可能是您在两种不同情况下显示不同的错误消息。内部消息将说“读取失败”,而外部消息将说“无法打开文件”。或者类似于那样的东西。要使用一个catch块实现这一点,您可以设置和检查指示进度的标志(这可能不会使代码比两个catch块更简单),或者您可以依赖异常本身包含适当的错误消息(在这种情况下,祝您好运将本地化框架与内置或第三方库中抛出异常的函数集成)。
请注意,即使只有一个catch,由于finally
,您仍然需要两个try。这不好:
try {
TextReader tr = new StreamReader("filename");
string content = tr.ReadToEnd();
} catch(Exception ex) {
} finally {
tr.Close();
}
从这种语言的外观来看,tr
在finally
块中不会被识别,因此我们无法在那里关闭它。我们必须在处理创建它的块内部关闭它。也许我们可以像这样处理它:
TextReader tr = null;
try {
tr = new StreamReader("filename");
string content = tr.ReadToEnd();
} catch(Exception ex) {
} finally {
if (tr != null) {
tr.Close();
}
}
但是与原始代码相比,这并没有真正简化事情,我们仍然需要处理2-3的差异,而现在我们根本不处理Close()
引起的异常。因此,对于许多目的来说,具有多个try/catch的原始代码更好。
new StreamReader
还是在ReadToEnd
时? - khachikfinally
结构。 - BoltClock