catch finally匹配
在try中抛出异常,CLR将去catch中匹配捕捉类型相同的catch块,如果找不到将去更上层的堆栈寻找。一旦找到匹配的catch块,就会执行内层的所有finally块执行完成后才会执行匹配的catch块,最后执行匹配catch块对应的finally块。
static void Main(string[] args)
{
try
{
try
{
try
{
throw new Exception();
}
finally
{
Console.WriteLine(1);
}
}
finally
{
Console.WriteLine(2);
}
}
catch (System.Runtime.CompilerServices.RuntimeWrappedException e)
{
Console.WriteLine("catch");
}
catch {
Console.WriteLine("catch");
}
finally
{
Console.WriteLine(3);
}
Console.ReadKey();
}
System.Runtime.CompilerServices.RuntimeWrappedException
在CLR2.0引入,用于非CLS相容异常(调用其他编程语言所抛出的异常)时,CLR自动构造一个RuntimeWrappedException类的实例,引用实际的抛出对象,这样非CLS相容异常就成为CLS相容异常。
在CLR2.0之前Exception无法捕捉非CLS相容异常。
try
{
//需要得体的进行恢复或清理的代码
}
catch (Exception e)
{
//在CLR2.0以前,这个块只能捕捉与CLS相容的异常
//在CLR2.0及以后,这个块能捕捉与CLS相容和CLS不相容的异常
throw;//重新抛出异常
}
catch
{
//在CLR所有版本中,这个块都能捕捉与CLS相容和CLS不相容的异常
throw;//重新抛出异常
}