这有点抽象,但是有没有可能抛出异常并使其进入多个catch块?例如,如果它匹配了一个特定的异常,然后是一个非特定的异常。
catch(Arithmetic exception)
{
//do stuff
}
catch(Exception exception)
{
//do stuff
}
拥有多个不同类型的catch块是完全可以接受的。然而,行为是第一个匹配的块处理异常。
它不会进入两个catch块。第一个匹配异常类型的catch块将处理该特定异常,即使在处理程序中重新抛出该异常也是如此,并且不会处理其他任何异常。一旦异常进入catch块,任何后续的catch块都将被跳过。
为了在两个块中捕获异常,您需要像这样嵌套块:
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
}
或者,你可以基于特定类型的异常在通用异常处理程序中进行过滤。
不,无法在单个异常处理块中执行两个catch块中的代码。
我可能会将通用异常块中的代码重构为可以从任何一个catch块调用的形式。
try
{
// blah blah blah
{
catch(Arithmetic ae)
{
HandleArithmeticException( ae );
HandleGenericException( ae );
}
catch(Exception e)
{
HandleGenericException( e );
}
像其他人说的那样,异常将被最具体的catch块捕获。
然而,这引出了我对异常处理的困惑。我希望你可以像下面这样做:
catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex)
{
}
不必再去做
catch (ArgumentNullExcpetion e)
{
}
catch (ArugmentOutOfRangeException outOfRange)
{
}
我理解反对这种做法的原因,可能是因为不同的异常需要采取不同的处理方式,但有时我希望将它们合并。
您不能有多个异常块处理同一个异常。但是您可以捕获通用异常,然后尝试转换为更具体的异常,如下所示:
catch (Exception exception)
{
var aex = exception as ArithmeticException
if (aex != null)
{
// do stuff specific to this exception type
}
// then do general stuff
}
Catch ex as Arithmetic When HandleArithmetic()
Catch ex as Exception
End Try
我并不赞同这种用法,尽管我之前见过在日志记录方面建议使用。我认为 C# 没有相应的语法。
这被称为异常过滤,在C#中不受支持(据说在VB.NET中是可能的)。
一个解决方法是捕获一般异常,然后在catch块中检查异常类型,并在继续执行块的其余部分之前对其进行任何特定处理。