• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > .NET(C#):Emit创建异常处理的方法

.NET(C#):Emit创建异常处理的方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了.net emit,c#emit,emit,qt emit,vue emit等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

目录

Emit异常处理流程
显示Exception对象的Message属性
返回目录
Emit异常处理流程
来看这种C#异常处理代码:

        {

            try

            {

                throw e;

            }

            catch (ApplicationException ex)

            {

                Console.WriteLine("捕获ApplicationException");

            }

            catch

            {

                Console.WriteLine("捕获Exception");

            }

            finally

            {

                Console.WriteLine("finally块");

            }

        }

</div>

我们将用反射Emit创建一个这样的方法。

其实IL中的异常处理代码还是比较复杂的,你可以在Reflector下看看异常处理的IL代码。不过好在ILGenerator类提供了一些方便的方法来创建异常处理代码。

基本套路就是用如下ILGenerator的方法:

BeginExceptionBlock方法来开始异常处理代码(相当于try)。
之后的代码可以用Opcodes.Throw来抛出异常,或者调用其他可以抛出异常的代码。
接着用BeginCatchBlock方法来开始一个Catch块,该方法可以指定catch需要捕获的异常类型,另外有一点需要注意的是凡是进入该catch方法,逻辑栈上会有相应类型的异常对象。 同时,这里也可以用Opcodes.Rethrow来重新抛出异常。
最后BeginFinallyBlock方法开始一个finally块。 (这里不需要手动加Opcodes.Leave)
当全部异常处理代码写完后,加上EndExceptionBlock方法来结束整块异常处理代码块。
注意方法最后还是必须要加IL的ret指令的(Opcodes.Ret),否则CLR无法运行此方法。

来看代码:

        //+ using System.Reflection.Emit;

        static void Main(string[] args)
        {
            var dm = GetMethod();

            dm.Invoke(null, new object[] { new ApplicationException() });

            dm.Invoke(null, new object[] { new Exception() });

        }
        static DynamicMethod GetMethod()

        {

            var dm = new DynamicMethod("", null, new Type[] { typeof(Exception) });

            var ilgen = dm.GetILGenerator();

            //try {

            ilgen.BeginExceptionBlock();

            //加载第一个参数,并throw

            ilgen.Emit(OpCodes.Ldarg_0);

            ilgen.Emit(OpCodes.Throw);

            ilgen.BeginCatchBlock(typeof(ApplicationException));

            //清空栈上的异常对象

            ilgen.Emit(OpCodes.Pop);

            ilgen.EmitWriteLine("捕获ApplicationException");

            ilgen.BeginCatchBlock(typeof(Exception));

            //清空栈上的异常对象

            ilgen.Emit(OpCodes.Pop);

            ilgen.EmitWriteLine("捕获Exception");

            ilgen.BeginFinallyBlock();

            ilgen.EmitWriteLine("finally块");

             //结束整个处理块

            ilgen.EndExceptionBlock();

            ilgen.Emit(OpCodes.Ret);

            return dm;

        }
</div>

输出:

finally块

捕获Exception

finally块
</div>
返回目录
显示Exception对象的Message属性
上面的代码并没有显示Exception对象的Message属性,上面主要是介绍Emit异常处理的流程,下面来看看怎样显示Message属性,如果是直接输出当然简单了,不过如果用到Console.WriteLine的格式字符串的话,需要在catch代码块中用一个临时变量。

如下代码:

        //+ using System.Reflection.Emit;
        static void Main(string[] args)
        {
            var dm = GetMethod();

            dm.Invoke(null, new object[] { new Exception("来自Mgen!") });
        }

        static DynamicMethod GetMethod()
        {

            var dm = new DynamicMethod("", null, new Type[] { typeof(Exception) });

      

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • .NET(C#):Emit创建异常处理的方法

相关文章

  • 2017-05-28C#调用Java代码的方法介绍
  • 2017-05-28动态webservice调用接口并读取解析返回结果
  • 2017-05-28C#中日期时间的简单操作
  • 2017-05-28C# 6.0 新特性汇总
  • 2017-05-28C#开发Android百度地图手机应用程序(多地图展示)
  • 2017-05-28WinForm 自动完成控件实例代码简析
  • 2017-05-28c#栈变化规则图解示例(栈的生长与消亡)
  • 2017-05-28简介C#读取XML的两种方式
  • 2017-05-28DevExpress TreeList 常见问题解决方法
  • 2017-05-28C#向线程中传递多个参数的解决方法(两种)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • winform c#中子窗体关闭刷新父窗体的实例
    • c#调用c++方法介绍,window api
    • 详解C# TimeSpan 计算时间差(时间间隔)
    • C#同步和异步调用方法实例
    • C#实现向函数传递不定参数的方法
    • C#代码设置开机启动示例
    • c#转换全角半角方法示例
    • C#中的除法运算符与VB.NET中的除法运算符
    • C# Dictionary的使用实例代码
    • C#简单读取、改变文件的创建、修改及访问时间的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有