2011-01-14 51 views
2
try 
{ 
    statement 1; 
    statement 2; 
    statement 3; 
    statement 4; 
    statement 5; 
} 
catch 
{ 
} 

以上是典型的试穿。如果其中一条语句进入捕捉状态,编码将跳转其余语句。如何在C#中异常恢复计算?

我想要做的是..

让我们说,声明中2有一个错误并进入例外,我还是想在声明3,4工作,5

我米只是好奇我怎么能做到这一点?

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

但我认为这太幼稚了。

+0

让你想 “的错误继续下一步” 在C#中? – Simon 2011-01-14 03:19:46

+0

*当你想要处理异常吗?如果`2`和`4`都会抛出异常呢?一旦`5'完成,你想要处理它们吗?或者你只是想忽略所有的错误? – Ani 2011-01-14 03:20:58

回答

6

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

如果你只是寻找一个简单的语法来写它,你需要重复同样的异常处理,你可以使用lambda表达式和写类似:

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

CallWithCatch定义看起来像这:

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

你需要单独捕获每个例外。

try 
{  
    statement 1;  
} 
catch {} 

try 
{ 
    statement 2; 
} 
catch {} 

// etc 

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

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);