如何在C#中恢复异常计算?

时间:2011-01-14 03:16:58

标签: c#

try
{
    statement 1;
    statement 2;
    statement 3;
    statement 4;
    statement 5;
}
catch
{
}

以上是典型的try-catch。如果其中一个语句进入catch,则编码将跳过其余语句。

我想做的是......

让我们说,语句2有一个错误并进入异常,我仍然希望在语句3,4和5上工作。

我只是好奇我怎样才能实现这一目标?

最简单的答案是5次尝试。

但我认为这太幼稚了。

3 个答案:

答案 0 :(得分:6)

使用单独的try .. catch构造通常是最好的做法,因为您应该处理最具体的异常(对于不同的语句可能会有所不同)。此外,异常可能会创建无效状态,因此继续可能不是最好的事情。

如果您只是在寻找一种更简单的语法来编写它,并且您需要重复相同的异常处理,那么您可以使用lambdas并编写如下内容:

CallWithCatch
 ( () => statement1,
   () => statement2,
   () => statement3,
   /* ... */ );

CallWithCatch的定义如下:

void CallWithCatch(params Action[] statements) {
  foreach(var statement in statements) { 
    try { 
      statement();
    } catch(/* your exception */) {
      // your exception handler
    }
  }
}

答案 1 :(得分:3)

一般来说,所有语句都可能抛出异常,如果抛出异常,您希望继续执行以下语句。最简单的解决方案是:

try
{
   statement1;
}
catch {}
try
{
   statement2;
}
catch {};
...

看起来很糟糕。改进是:

public void TryStatements(params Action[] actions)
{
   foreach(Action act in actions)
   {
     try
     {
        act();
     }
     catch(SomeCommonException ex)
     {
        //do something special
     }
     catch(Exception ex)
     {
        //something else
     }
   }
}

然后你可以:

   TryStatement(()=>statement1,()=>satement2);

答案 2 :(得分:1)

您需要单独捕获每个异常。

try 
{     
    statement 1;     
}
catch {}

try
{
    statement 2;
}
catch {} 

// etc

或者,您可以将statement1statement2等提取到自己的方法中,每个方法都包含自己的try/catch。这样,每个操作都可以关注任何特定的异常,并且您可以处理所有预期的异常,让未处理的异常像往常一样冒泡。