嵌套try-catch块有什么意义?

| 这是一个伪代码:
try
{
  TextReader tr = new StreamReader(\"filename\");
  try
  {
    string content = tr.ReadToEnd();
  }
  catch(Exception ex)
  { /*Show error message*/ }
  finally
  { tr.Close();}
}
catch(Exception ex)
{ /*Show error message*/ }
好的,该代码是一本书的示例。我不明白的是为什么要使用嵌套的try-catch块。 如果
string content = tr.ReadToEnd();
出了错,那么外部捕获应该捕获异常对吗?因此,我看不出对该行使用额外的try-catch的任何意义! 如果您在这里看到任何误解,那么如果您能指出这些误解,我将非常高兴! 还有在任何情况下都可以合理使用嵌套try-catch吗?     
已邀请:
您的示例与类似的代码(其中只有一个外部捕获)之间的区别: 1)如果内部程序段抛出了,则在调用
Close()
之前先打印消息。如果
Close()
还包含日志记录,则这可能很重要。 2)如果内部异常被抛出并被捕获,然后在finally块
Close()
中也抛出,您将获得两个异常并处理两个异常。仅使用一个catch块,如果抛出
Close()
,那么接下来会发生什么情况取决于语言,但是不会打印出两条错误消息。我希望第二种例外情况能取代第一种例外,但我不敢保证所有使用with6的语言,甚至是我使用过的所有语言都会发生这种情况。 3)
//Show error message
只是注释,它什么也不做。作者可能打算在两种不同的情况下显示不同的错误消息。内层会说“读取失败”,外层会说“无法打开文件”。或类似的东西。要仅使用一个catch块就可以实现这一点,您可以设置并检查一个指示进度的标志(这可能不会使代码比两个catch块简单得多),或者您可以依靠异常本身来包含适当的错误消息(在这种情况下,将您的本地化框架与内置库或第三方库中的异常抛出函数集成在一起会很幸运)。 请注意,即使只有一个接球,由于,6ѭ,仍然需要两次尝试。这不好:
try {
    TextReader tr = new StreamReader(\"filename\");
    string content = tr.ReadToEnd();
} catch(Exception ex) {
    // show error message
} finally {
    tr.Close();
}
因为从这种语言的外观来看,
tr
不会在
finally
块中出现,因此我们无法在此处将其关闭。我们必须在处理它的块内将其关闭。也许我们可以这样处理:
TextReader tr = null;
try {
    tr = new StreamReader(\"filename\");
    string content = tr.ReadToEnd();
} catch(Exception ex) {
    // show error message
} finally {
    if (tr != null) {
        tr.Close();
    }
}
但这与原始代码相比并没有真正简化很多事情,我们仍然要面对2-3的差异,而现在我们根本不处理
Close()
的异常。因此,出于多种目的,具有多个try / catch的原始代码更好。     
  如果ѭ14错误,那么外部接球应该接异常吗? 不,内部的
catch
会抓住它并显示错误消息。然后执行内部的
finally
。然后,外部
try
块完成处理,没有任何异常,因为内部
try-catch
块已经处理完毕。     
我使用的一个示例是当我需要处理特定类型的异常时:
    try
    {

           //...
           //IMPORTANT CODE HERE
           //....
        try
        {
            // Read in non-existent file.
            using (StreamReader reader = new StreamReader(\"not-there.txt\"))
            {
            reader.ReadToEnd();
            }
        }
        catch (FileNotFoundException ex)
        {
           //Do something important here
        }
       //...
       //MORE IMPORTANT CODE
       //...
    }
    catch(Exception ex) ///An Exception I\'m not expecting
    { //oops...handle gracefully here
 }
    
您希望尽早捕获异常。让事情冒出外部异常是一种不好的做法。记住规则:过早失败,经常失败。     

要回复问题请先登录注册