嵌套的Try和Catch块

31

我在一个自定义的C#代码中嵌套了try-catch块,与SharePoint相关。当内部try块中的代码抛出异常时,我希望只执行一个catch块(即内部块)。

try
{
 //do something

   try
   {
        //do something              if exception is thrown, don't go to parent catch

   }
   catch(Exception ex) {...}

}
catch(Exception ex)
{ .... }

我知道我可以使用不同类型的异常,但这不是我想要的。

概述

如果出现异常,我不希望它除了内部的catch之外,还到达父catch


他们通常不会去到“父级”。 - H H
@HenkHolterman 在我的情况下是这样的,如果内部的 try 抛出错误,我会同时收到两个异常 :( - Mathematics
1
那么问题缺少最重要的部分。它关于你在 catch(Exception ex) {...} 中的 ... 做什么。 - H H
2个回答

33

如果您不想在这种情况下执行外部异常,则不应该从内部catch块中抛出异常。

try
{
 //do something
   try
   {
      //do something              IF EXCEPTION HAPPENs don't Go to parent catch
   }
   catch(Exception ex)
   {  
     // logging and don't use "throw" here.
   }
}
catch(Exception ex)
{ 
  // outer logging
}

19

如果内部的catch处理了异常,外部的catch将不会触发。

如果您想让外部的catch也触发,您需要这样做:

try
{
 //do something

   try
   {
        //do something 

   }
   catch(Exception ex) 
    {
        // do some logging etc...
        throw;
    }

}
catch(Exception ex)
{ 
    // now this will be triggered and you have 
    // the stack trace from the inner exception as well
}

基本上,由于您现在的代码,外部的catch不会从内部的try {} catch {}触发。


2
值得赞扬的是,我有和提问者一样的问题。情况是这样的:在Android上使用.Net PCL/Xamarin。调用内部带有try/catch的异步方法。让它调用另一个异步方法,并且该方法也有try/catch包围着单个调用。该调用失败了。虽然内部的try/catch捕获了异常(Exception ex),但是它并没有被捕获。相反,太晚了,外部的try/catch才捕获了它。我怀疑在某些VM中,嵌套的try/catch实际上并不被支持。 - Chris Moschini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接