快捷搜索:

.Net Discovery系列之十二-深入理解平台机制与性能

上一篇文章中Aicken为大年夜家先容了.Net平台的垃圾收受接收机制、即时编译机制与其对机能的影响,这一篇中将继承为大年夜家先容.Net平台的非常捕获机制与字符串驻留机制。

三.关于非常捕获机制

虽然我们已经很费力了,然则仍旧有很多缘故原由使代码运行掉败,如引用null引用、索引越界、内存溢出、类型转换掉败等等。这就必要我们的代码有足够的容错能力,在代码运行掉败时,及时、主动的处置惩罚这些非常。

● 机制阐发

.Net 中基础的非常捕获与处置惩罚机制是由try…catch…finally块来完成的,它们分手完成了非常的监测、捕获与处置惩罚事情。一个try块可以对应零个或多个catch块,可以对应零个或一个finally块。不过没有catch的try彷佛没有什么意义,假如try对应了多个catch,那么监测到非常后,CLR会自上而下搜索catch块的代码,并经由过程非常过滤器筛选对应的非常,假如没有找到,那么CLR将沿着调用客栈,向更高层搜索匹配的非常,假如已到客栈顶部依然没有找到对应的非常,就会抛出未处置惩罚的非常了,这时catch块中的代码并不会被履行。以是间隔try近来的catch块将最先被遍历到。

以下代码:

try

{

Convert.ToInt32("Try");

}

catch (FormatException ex1)

{

string CatchFormatException= "CatchFormatException";

}

catch (NullReferenceException ex2)

{

string CatchNullReferenceException= "CatchNullReferenceException";

}

finally

{

string Finally= "Finally";

}

对应IL如下:

.method private hidebysig instance voidForm1_Load(object sender,

class [mscorlib]System.EventArgs e) cil managed

{

// Code size53 (0x35)

.maxstack1

.locals init ([0] class [mscorlib]System.FormatException ex1,

[1] string CatchFormatException,

[2] class [mscorlib]System.NullReferenceException ex2,

[3] string CatchNullReferenceException,

[4] string Finally)

IL_0000:nop

IL_0001:nop

IL_0002:ldstr"Try"

IL_0007:callint32 [mscorlib]System.Convert::ToInt32(string)

IL_000c:pop

IL_000d:nop

IL_000e:leave.sIL_0026

IL_0010:stloc.0

IL_0011:nop

IL_0012:ldstr"CatchFormatException"

IL_0017:stloc.1

IL_0018:nop

IL_0019:leave.sIL_0026

IL_001b:stloc.2

IL_001c:nop

IL_001d:ldstr"CatchNullReferenceException"

IL_0022:stloc.3

IL_0023:nop

IL_0024:leave.sIL_0026

IL_0026:nop

IL_0027:leave.sIL_0033

IL_0029:nop

IL_002a:ldstr"Finally"

IL_002f:stloc.sFinally

IL_0031:nop

IL_0032:endfinally

IL_0033:nop

IL_0034:ret

IL_0035:

// Exception count 3

.try IL_0001 to IL_0010 catch [mscorlib]System.FormatException handler IL_0010 to IL_001b

.try IL_0001 to IL_0010 catch [mscorlib]System.NullReferenceException handler IL_001b to IL_0026

.try IL_0001 to IL_0029 finally handler IL_0029 to IL_0033

} // end of method Form1::Form1_Load

您可能还会对下面的文章感兴趣: