IL异常处理
异常处理在程序中也算是比较重要的一部分了,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异常处理的更多相关文章
- C# to IL 10 Exception Handling(异常处理)
Exception handling in IL is a big let down. We expected a significant amount of complexity,but were ...
- .NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)
什么是CLR? CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”.他的核心功能包括(内存管理.程序集加载.安全性.异常处理和线程同步),可以被面 ...
- .NET IL学习笔记(一)
参考资料: 1. <.NET IL Assembler> 2. NGEN代码产生器 3. NGEN的使用 4. IL编辑器下载 5. IL编辑器的使用 知识点: ● Common Lang ...
- 进阶篇:以IL为剑,直指async/await
接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...
- MSIL 教程(三):类和异常处理(转)
转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857771.html 续上文[翻译]MSIL 教程(二):数组.分支.循环.使用不安全代 ...
- mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破
这一节课,沈老师带我们了解事务的异常 什么是异常? 我们先插入一组数据: ,10.5); 这个是正常的.但是我们把插入的user_money的值故意弄错:如下 ,‘abc’); 那么我们会得到一个ER ...
- 谈谈托管代码、IL、CLR、ISAPI?
什么是托管代码? 托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,这些语言包括:C#, J#, Microsoft Visual Bas ...
- 读懂IL
读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...
- C#多线程编程(4)--异常处理+前三篇的总结
本来是打算讲并行For和PLINQ的,但是我感觉前三篇我没有讲得很清晰.之前一直在看<CLR via C#>(后文简称CLR)的多线程部分,其中有些部分不是很明白,今天翻开<果壳中的 ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- Windows Server 2012 NIC Teaming介绍及注意事项
Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...
- 让姑姑不再划拳 码农也要有原则 : SOLID via C#
“姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 关于 devbridge-autocomplete 插件多选操作的实现方法
目前据我所知最好用的 autocomplete 插件就是 jquery-ui 的 autocomplete 以及 devbridge 的 autocomplete 插件. 我最终选择了 devbrid ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- java面向对象六原则一法则
1. 单一职责原则:一类只做它该做的事. 2. 里氏替换原则:子类必须能够替换基类(父类),否则不应当设计为其子类. 3. 依赖倒换原则:设计要依赖于抽象而不是具体化. 4. 接口隔离原则:接口要小而 ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
- Android—关于自定义对话框的工具类
开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...