当前位置:主页   - 电脑 - 网站开发 - ASP.Net
Emit学习-进阶篇-异常处理
来源:网络   作者:   更新时间:2012-03-26
收藏此页】    【字号    】    【打印】    【关闭

  本文示例源代码或素材下载

  异常的处理也是程序中比较重要的一个部分,今天我们就针对用IL书写异常处理代码进行讲解,首先照例给出要实现的类的C#代码,如下:

  ExceptionHandler

class ExceptionHandler
{
    public static int ConvertToInt32(string str)
    {
        int num = 0;
        try
        {
            num = Convert.ToInt32(str);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return num;
    }
}

  代码比较简单,主要就是阐述如何在IL代码中加入try、catch块。这里面会用到ILGenerator类中的几个新方法,介绍如下:

  l  BeginExceptionBlock:用来表示需要异常处理的代码的开始,相当于C#代码中的try关键字;

  l  EndExceptionBlock:这个与BeginExceptionBlock配对,用来表示异常处理的结束。注意:这里的结束并不是只try语句块的结束,而是指整个try catch语句块的结束;

  l  BeginCatchBlock:这个用来表示catch操作的开始,该方法需要传入要需要捕捉的一场的类型,程序中可以有多个BeginCatchBlock,即多个catch块。

  相关代码如下:

  Exception

TypeBuilder typeBuilder = moduleBuilder.DefineType("ExceptionHandler", TypeAttributes.Public);

MethodBuilder methodBuilder = typeBuilder.DefineMethod("ConvertToInt32", MethodAttributes.Public | MethodAttributes.Static, typeof(Int32), new Type[] { typeof(string) });

ILGenerator methodIL = methodBuilder.GetILGenerator();
LocalBuilder num = methodIL.DeclareLocal(typeof(Int32));

//int num = 0;
methodIL.Emit(OpCodes.Ldc_I4_0);
methodIL.Emit(OpCodes.Stloc_0);

//begin try
Label tryLabel = methodIL.BeginExceptionBlock();
//num = Convert.ToInt32(str);
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
methodIL.Emit(OpCodes.Stloc_0);
//end try

//begin catch 注意,这个时侯堆栈顶为异常信息ex
methodIL.BeginCatchBlock(typeof(Exception));
//Console.WriteLine(ex.Message);
methodIL.Emit(OpCodes.Call, typeof(Exception).GetMethod("get_Message"));
methodIL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
//end catch
methodIL.EndExceptionBlock();

//return num;
methodIL.Emit(OpCodes.Ldloc_0);
methodIL.Emit(OpCodes.Ret);       

Type type = typeBuilder.CreateType();

assemblyBuilder.Save(fileName);

  系列文章:

  Emit学习-基础篇-HelloWorld

  Emit学习-基础篇-基本概念介绍

  Emit学习-基础篇-为动态类添加属性、构造函数、方法

  Emit学习-答疑篇-Call和Callvirt的区别

  Emit学习-答疑篇-值类型和引用类型在使用时的区别

  Emit学习-基础篇-使用循环

  Emit学习-进阶篇-定义事件

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明