异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法

1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像

2.EndExceptionBlock:异常块代码结束,BeginExceptionBlock相当于try,EndExceptionBlock却不是try结束。而是整个异常块处理的结束。

3.BeginCatchBlock:catch块代码

4.BeginFinallyBlock:finally块代码

5.ThrowException:抛出异常

下面我们就通过代码来实现一下。

一、异常信息捕捉

首先我们做一个简单的异常捕捉,然后输出对应的异常信息,首先给出C#代码:

            ;
            try
            {
                translationInt = Convert.ToInt32(translationStr);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return translationInt;

实现代码也比较简单

            string name = "IL4.Dynamic";
            string fileName = string.Format("{0}.dll", name);

            //构建程序集
            AssemblyName assemblyName = new AssemblyName(name);
            //应用程序集域
            AppDomain domain = AppDomain.CurrentDomain;
            //实例化一个AssemblyBuilder对象来实现动态程序集的构建
            AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);

            //定义模块(不加filename为瞬态模块,不持久)
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name, fileName);

            //定义类型
            TypeBuilder typeBuilder = moduleBuilder.DefineType(name, TypeAttributes.Public);

            MethodBuilder methodbuilder = typeBuilder.DefineMethod("ExceptionTest", MethodAttributes.Public, typeof(Int32), new Type[] { typeof(string) });
            ILGenerator IL = methodbuilder.GetILGenerator();
            LocalBuilder translationInt = IL.DeclareLocal(typeof(Int32));

            Type translationException = typeof(Exception);
            ConstructorInfo constructorInfo = translationException.GetConstructor(new Type[] { typeof(string) });
            MethodInfo exToString = translationException.GetMethod("ToString");

            IL.Emit(OpCodes.Ldc_I4_0);
            IL.Emit(OpCodes.Stloc_0);

            Label tryLabel = IL.BeginExceptionBlock();
            IL.Emit(OpCodes.Ldarg_1);
            IL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
            IL.Emit(OpCodes.Stloc_0);

            IL.BeginCatchBlock(typeof(Exception));
            IL.EmitCall(OpCodes.Callvirt, exToString, null);
            IL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
            IL.EndExceptionBlock();

            IL.Emit(OpCodes.Ldloc_0);
            IL.Emit(OpCodes.Ret);

二、抛出异常

程序中有时候,不仅要捕捉异常信息,有时候也是需要抛出对应的异常信息,throw new Exception("translation Exception");这时候就需要用到ThrowException,代码如下:

            IL.Emit(OpCodes.Ldstr, "translation Exception");
            IL.Emit(OpCodes.Newobj, constructorInfo);
            IL.ThrowException(typeof(newException));
            IL.Emit(OpCodes.Ldstr, ");
            IL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
            IL.Emit(OpCodes.Stloc_0);
            IL.EmitCall(OpCodes.Callvirt, exToString, null);
            IL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));

1.IL.Emit(OpCodes.Newobj, constructorInfo):相当于是一个 new Exception("translation Exception");

2.不过在这一步有一个疑点, IL.ThrowException(typeof(newException));是不会把异常信息"translation Exception"抛出,而在对应的操作IL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));却能输出这部分的异常信息。可以看下反编译后的代码

三、finally处理

finally实现也是比较简单的,直接上代码把

            IL.BeginFinallyBlock();
            IL.Emit(OpCodes.Ldstr, ");
            IL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
            IL.Emit(OpCodes.Stloc_0);
            IL.EmitWriteLine("Finally");
            IL.EndExceptionBlock();

异常处理这块msdn写得也比较清楚,我也不多说了,示例代码ExceptionDemo

IL异常处理的更多相关文章

  1. C# to IL 10 Exception Handling(异常处理)

    Exception handling in IL is a big let down. We expected a significant amount of complexity,but were ...

  2. .NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)

    什么是CLR? CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”.他的核心功能包括(内存管理.程序集加载.安全性.异常处理和线程同步),可以被面 ...

  3. .NET IL学习笔记(一)

    参考资料: 1. <.NET IL Assembler> 2. NGEN代码产生器 3. NGEN的使用 4. IL编辑器下载 5. IL编辑器的使用 知识点: ● Common Lang ...

  4. 进阶篇:以IL为剑,直指async/await

    接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...

  5. MSIL 教程(三):类和异常处理(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857771.html 续上文[翻译]MSIL 教程(二):数组.分支.循环.使用不安全代 ...

  6. mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破

    这一节课,沈老师带我们了解事务的异常 什么是异常? 我们先插入一组数据: ,10.5); 这个是正常的.但是我们把插入的user_money的值故意弄错:如下 ,‘abc’); 那么我们会得到一个ER ...

  7. 谈谈托管代码、IL、CLR、ISAPI?

    什么是托管代码?       托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,这些语言包括:C#, J#, Microsoft Visual Bas ...

  8. 读懂IL

    读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...

  9. C#多线程编程(4)--异常处理+前三篇的总结

    本来是打算讲并行For和PLINQ的,但是我感觉前三篇我没有讲得很清晰.之前一直在看<CLR via C#>(后文简称CLR)的多线程部分,其中有些部分不是很明白,今天翻开<果壳中的 ...

随机推荐

  1. 前端框架 EasyUI (2)页面布局 Layout

    在 Web 程序中,页面布局对应用程序的用户体验至关重要. 在一般的信息管理类的 Web 应用程序中,页面结构通常有一个主工作区,然后在工作区上下左右靠近边界的区域设置一些边栏,用于显示信息或放置一些 ...

  2. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  3. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  4. Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配

    (原创:http://www.cnblogs.com/linguanh) 目录: 前序 一,问题描述 二,为何会如此"无情"? 三,目前存在该问题的知名SDK 四,解决方案,1 对 ...

  5. 【HanLP】资料链接汇总

    Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...

  6. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  7. C#发送邮箱

    之前自己从来没有做过发送邮箱的功能,前段时间项目需要,在找了很多帖子之后,终于实现了. 之后有整理了一下,写了一个类.直接给类传递信息,就可以发送了. 这里还需要说明的是,发送邮箱需要开通POP3/S ...

  8. 似懂非懂的localStorage和sessionStorage

    一.区别 相信很多人都见过这两个关于HTML5的新名词!HTML5种的web storage包含两种存储方式:localStorage和sessionStorage,这两种方式存储的数据不会自动发给服 ...

  9. mysql百万级分页优化

    普通分页 数据分页在网页中十分多见,分页一般都是limit start,offset,然后根据页码page计算start , 这种分页在几十万的时候分页效率就会比较低了,MySQL需要从头开始一直往后 ...

  10. JavaScript 写计算器改进版

    <html><head><style> .short{height:50px;width:55px;float:left;}</style></h ...