我可以执行多个Catch块吗?

时间:2010-10-27 16:32:09

标签: c# exception-handling try-catch

这有点抽象,但是有没有办法抛出异常并让它进入多个catch块?例如,如果它匹配特定异常后跟非特定异常。

catch(Arithmetic exception)
{
  //do stuff
}
catch(Exception exception)
{
  //do stuff
}

6 个答案:

答案 0 :(得分:37)

拥有多个不同类型的捕获块是完全可以接受的。但是,行为是第一个候选块处理异常。

它不会进入BOTH catch块。匹配异常类型的第一个catch块将处理该特定异常,而不处理其他异常,即使它在处理程序中重新抛出。一旦异常进入catch块,将跳过任何后续的。

为了在BOTH块中捕获异常,您需要嵌套块,如下所示:

try
{
     try
     {
        // Do something that throws  ArithmeticException
     }
     catch(ArithmeticException arithException)
     {
        // This handles the thrown exception....

        throw;  // Rethrow so the outer handler sees it too
     }
}
catch (Exception e)
{
   // This gets hit as well, now, since the "inner" block rethrew the exception
}

或者,您可以根据特定的异常类型过滤通用异常处理程序。

答案 1 :(得分:21)

没有。对于单个异常,不可能在两个catch块中执行代码。

我可能会将通用异常块中的代码重构为可以从其中调用的内容。

try
{
   // blah blah blah
{
catch(Arithmetic ae)
{
   HandleArithmeticException( ae );
   HandleGenericException( ae );
}
catch(Exception e)
{
  HandleGenericException( e );
}

答案 2 :(得分:3)

与其他人一样,异常将被最具体的捕获块捕获。

虽然有异常处理,但这让我感到沮丧。我希望你能做点像

catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex)
{

}

而不是必须做

catch (ArgumentNullExcpetion e)
{
}
catch (ArugmentOutOfRangeException outOfRange)
{
}

我理解反对这一理由的原因是你可能会针对不同的例外做不同的事情,但有时我想要将它们结合起来。

答案 3 :(得分:2)

您不能有多个异常块处理相同的异常。但是你可以做的是捕获一般异常,然后尝试转换为更具体的,如下所示:

catch (Exception exception)
{
    var aex = exception as ArithmeticException
    if (aex != null)
    {
        // do stuff specific to this exception type
    }
  // then do general stuff
}

答案 4 :(得分:2)

如果您使用的是VB.NET,则可以将Arithmetic异常中的错误处理程序抽象为始终返回false的函数或方法调用。

然后你可以这样写:

Catch ex as Arithmetic When HandleArithmetic()
Catch ex as Exception

End Try

虽然我之前已经看过它建议用于日志记录,但并不是我会提倡这样的用法。我不相信有一个C#等价物。

答案 5 :(得分:-1)

这称为异常过滤,C#不支持(我告诉它可以在VB.NET中使用)。

一个解决方法是捕获常规异常,然后检查catch块中的异常类型,并在继续执行块的其余部分之前对其进行任何特定处理。