我可以避免C#中的异常,继续执行代码吗?

时间:2009-10-13 14:53:36

标签: c# visual-studio visual-studio-2008 exception-handling c#-3.0

我有以下C#代码。每当发现异常时(比如第1行),我就无法到达其他行(2,3,4等)。

try
{
    line1
    line2
    ...
}
catch (Exception ex)
{
    ...
}

在C#中,是否有可能说如果第1行产生异常,只需继续其他行(2,3,4等)?

13 个答案:

答案 0 :(得分:16)

不应忽视例外情况。 :)
它们存在并被抛出是有原因的:出现了异常情况,某种情况未得到满足,我无法继续工作......

如果在每行代码周围放置一个try / catch块,可以忽略异常,但我不认为你真的想这样做......

答案 1 :(得分:10)

你可以像这样创建一个SkipOnError方法:

private SkipOnError(Action action)
{
    try 
    {
        action();
    }
    catch
    {
    }
}

然后你可以这样称呼它:

try
{ 
    SkipOnError(() => /*line1*/);
    line2;
    line3;
} catch {}

修改:这样可以更轻松地跳过给定的例外:

private SkipOnError(Action action, Type exceptionToSkip)
{
    try 
    {
        action();
    }
    catch (Exception e)
    {
        if (e.GetType() != exceptionToSkip) throw;            
    }
}

注意:我实际上并没有建议你这样做 - 至少不是经常这样做,因为我发现自己很讨厌。但它确实展示了我们现在可以在C#中做的一些功能性事情,是的!

我真正要做的是:将line1重构为方法(提取方法)。该新方法应该处理任何可预见的异常(如果它们可以被处理),从而使调用者处于已知状态。因为有时候你真的想做line1,除非,如果发生错误就可以了......

答案 2 :(得分:5)

只是试着赶上第1行

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

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

弗雷德里克是对的,虽然这样做时你真的需要小心。它应该根据具体情况使用。只有当您知道该过程应该继续时,才应该使用它。否则你应该相应地处理异常。

答案 3 :(得分:4)

如果有总是希望执行的代码,即使抛出异常,即使异常未在catch块中被捕获,或者catch块重新抛出或抛出新异常,应该进入“最后”块:

try
{
  do(something);
}
catch (InvalidArgumentException ex)
{
  onlyDealWithOneExceptionType();
}
finally
{
  always.runs(no, matter, what);
}

答案 4 :(得分:3)

你可以将每一行隔离成一个try-catch块,但这对我来说只是一些代码。如果您 某些 ,第一行之后的行不会抛出异常,或者无论异常都需要执行并且不会抛出其他错误,您可以添加一个第一次捕获后阻止。例如:

try{
  line 1;
}
catch(Exception exc){
  //Error handling logic here
}
finally{
  line 2;
  line 3;
  .
  .
  .
  line n;
}

答案 5 :(得分:2)

你可以在try catch块中包装第1行。

答案 6 :(得分:1)

你可以随时

try 
{
   line1
}
catch (Exception ex)
{
}
line2
...

但是没有像“重试”关键字那样的内容。

答案 7 :(得分:1)

根据建议,您应该在此特定示例中将try catch包装在line1周围。但是,为了将来注意,你应该只在try catch块中有条件,如果没有例外,你只想完成它。

答案 8 :(得分:1)

你可以将其他行放在finally子句中,但这样会非常难看,特别是如果这些行也会抛出异常......

你应该从第一个异常中恢复,然后继续到下一行,将每个异常包装在try / catch语句中。

答案 9 :(得分:1)

正如其他人所说,首先要确保“忽略”异常就是你真正想做的事情。 如果它仍然存在,并且所有try-catch的语法开销太高,你可以使用execute-around idom来包装它。

我现在没有时间草拟所有代码 - 但是你要做的是编写一个方法,该方法接受一个匿名委托并在try-catch中执行它(可能记录任何异常,或者过滤那些异常那是“好的”)。将此方法称为tryDo。然后你可以写这样的代码:

tryDo( delegate(){ line1; } );
tryDo( delegate(){ line2; } );

它仍然有点冗长,但是你不想让这些东西太容易了。这只是足够的开销让你不断想知道这是否正确: - )

答案 10 :(得分:1)

您需要可再生的延续才能做到这一点。 CLR和C#不支持,并且可能永远不会这样做。 :(

答案 11 :(得分:0)

try
{
    line1
    line2
    ...
}
catch (Exception ex)
{
    ...
}
finally
{
    if(line1ErrorOccured)
    {
        line2
        ...
    }
}

没有考虑太多的想法

答案 12 :(得分:0)

如果可以处理您的异常并继续,您应该本地化您的try / catch块。

try
{
  line1;
}
catch (ExpectedException e)
{
  // Handle your exception, prepare data for the next lines
  // Could you have prevented the exception in the first place?
}

try
{
  line2;
  line3;
}
catch (AnotherExpectedException e)
{
  // Maybe this exception you can't continue from. Perhaps log it and throw;
}

请记住异常是例外。如果抛出异常,应该出错。你应该首先尝试防止例外。