try
{
statement 1;
statement 2;
statement 3;
statement 4;
statement 5;
}
catch
{
}
以上是典型的try-catch。如果其中一个语句进入catch,则编码将跳过其余语句。
我想做的是......
让我们说,语句2有一个错误并进入异常,我仍然希望在语句3,4和5上工作。
我只是好奇我怎样才能实现这一目标?
最简单的答案是5次尝试。
但我认为这太幼稚了。
答案 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
或者,您可以将statement1
,statement2
等提取到自己的方法中,每个方法都包含自己的try/catch
。这样,每个操作都可以关注任何特定的异常,并且您可以处理所有预期的异常,让未处理的异常像往常一样冒泡。