写完这一篇,大概可以准备过年了,就算是这系列文章的收尾吧。

异常处理语句,就是常说的try...catch语句,有时候,也会带有finally子句。要生成异常处理语句,得用到CodeTryCatchFinallyStatement类,它包含三个部分。

1、TryStatements:尝试执行的代码块。

2、CatchClauses:捕捉异常的代码块。CatchClauses是一个子句集合,因为一个try语句可以包含N个catch子句,而每个catch块都由CodeCatchClause类来表示,使用时应提供要捕捉的异常的类型,异常对象的临时变量名,以及catch块的语句集合。

3、FinallyStatements:finally语句块,不管会不会发生异常,finally中的语句会执行。

下面看一个最常见的try语句的生成。

            CodeTryCatchFinallyStatement trycatfanStatement = new CodeTryCatchFinallyStatement();
trycatfanStatement.TryStatements.Add(new CodeCommentStatement("试着执行"));
CodeCatchClause catClause = new CodeCatchClause();
// 异常类型
catClause.CatchExceptionType = new CodeTypeReference(typeof(Exception));
// 临时变量名
catClause.LocalName = "ex";
// catch块中的语句
catClause.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(typeof(Console)), nameof(Console.WriteLine)), new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("ex"), nameof(Exception.Message))));
// 记得将 CodeCatchClause 对象加入到 CatchClauses 集合中
trycatfanStatement.CatchClauses.Add(catClause); CodeDomProvider provider = CodeDomProvider.CreateProvider("cs");
provider.GenerateCodeFromStatement(trycatfanStatement, Console.Out, null);

以上代码只生成了try和catch两个子块,这种形式是最为常见的。其生成的代码如下。

当然,如果需要,还可以添加上 finally 块,在上面的示例代码中加入以下代码:

            trycatfanStatement.FinallyStatements.Add(new CodeCommentStatement("清理操作"));

然后生成的代码中就会包含 finally 块了。

try 语句可以包括多个 catch 子句,比如这样。

            CodeTryCatchFinallyStatement trystatement = new CodeTryCatchFinallyStatement();
trystatement.TryStatements.Add(new CodeCommentStatement("待执行代码"));
// 第一个 catch 子句
CodeCatchClause catch1 = new CodeCatchClause();
catch1.CatchExceptionType = new CodeTypeReference(typeof(FormatException));
catch1.LocalName = "fex";
catch1.Statements.Add(new CodeCommentStatement("捕捉异常"));
trystatement.CatchClauses.Add(catch1);
// 第二个 catch 子句
CodeCatchClause catch2 = new CodeCatchClause();
catch2.CatchExceptionType = new CodeTypeReference(typeof(ArgumentException));
catch2.LocalName = "gex";
catch2.Statements.Add(new CodeCommentStatement("捕捉异常"));
trystatement.CatchClauses.Add(catch2); CodeDomProvider p = CodeDomProvider.CreateProvider("C#");
p.GenerateCodeFromStatement(trystatement, Console.Out, null);

以上代码生成的try语句包含两个catch子句,分别捕捉FormatException和ArgumentException两种类型的异常。生成的代码如下。

顺便也说说抛出异常的语句,使用的是 CodeThrowExceptionStatement 类,例如

            CodeThrowExceptionStatement ts = new CodeThrowExceptionStatement(new CodeObjectCreateExpression(typeof(FieldAccessException)));

生成的throw语句如下图所示。

传递给 CodeThrowExceptionStatement 构造函数的参数为要抛出的异常对象,本例直接用new关键字来创建异常实例。如果明确定义了异常变量,可以引用变量。就像这样。

            CodeVariableDeclarationStatement vd = new CodeVariableDeclarationStatement(typeof(EncoderFallbackException), "ex", new CodeObjectCreateExpression(typeof(EncoderFallbackException)));
CodeThrowExceptionStatement ts = new CodeThrowExceptionStatement(new CodeVariableReferenceExpression("ex")); CodeDomProvider p = CodeDomProvider.CreateProvider("cs");
p.GenerateCodeFromStatement(vd, Console.Out, null);
p.GenerateCodeFromStatement(ts, Console.Out, null);

生成的代码如下。

===========================================

好了,Code DOM 系列文章就写完了。

过年后,如果能赶上 Windows 10 “红石2”的更新,那咱们就继续聊 UWP 相关的内容。

提前祝大伙新春快乐。

【.net 深呼吸】细说CodeDom(10):生成异常处理语句的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(8):分支与循环

    有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...

  2. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  3. 将表里的数据批量生成INSERT语句的存储过程 继续增强版

    文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...

  4. 通过存储过程批量生成spool语句

    过存储过程批量生成spool语句 CREATE OR REPLACE PROCEDURE pro_yx_full_txt IS export_handle UTL_FILE.file_type; v_ ...

  5. Java 自定义注解及注解读取解析--模拟框架生成SQL语句

    假设们使用一张简单的表,结构如下: 定义注解: 表注解: package com.xzlf.annotation; import java.lang.annotation.ElementType; i ...

  6. 未找到数据,异常处理:exception when no_data_found then 异常处理语句;

    未找到数据. 在 select 字段 Into 变量 from 表 where 条件: 这种语句中很有可能会有select 不到数据的问题,导致报错"未找到数据" 要解决这种问题需 ...

  7. 将表里的数据批量生成INSERT语句的存储过程

    有时候,我们需要将某个表里的数据全部导出来,迁移到另一个相同结构的库中,这里可以采取一个简便的方法,通过一个存储过程批量导出数据并生成SQL语句,非常方便.存储过程如下: )) as begin de ...

  8. 利用反射自动生成SQL语句(仿Linq)

    转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...

  9. Excel数据生成Sql语句的方法

    选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可  代码如下 复制代码 ,=CONCATENA ...

随机推荐

  1. JavaScript 逗号表达式

    逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n  逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值.最后整个逗号表达式的值是表达式n的值.  ...

  2. IT人常用的网站

    一.网页设计类 蓝色理想 http://www.blueidea.com 网页设计师联盟 http://www.68design.net 网页设计大本营 http://www.code-123.com ...

  3. hibernate的优化

    1.使用双向一对多关联,不实用单项一对多2.不用一对一,使用一对多3.配置对象缓存,不使用集合缓存

  4. 方法的标签_With携带

    方法中参数的标签: 标签的由来:1.标签也是方法名的一部分:2.为了提高程序的阅读性:OC方法允许我们给每个参数添加一个标签来说明当前参数的含义: 标签的作用:标签是为了标识变量的,因此标签名和变量名 ...

  5. php 语法中有 let 吗?

    来源:http://stackoverflow.com/questions/9705281/with-and-let-in-php use(&$a) 用 use ($parameter) 这种 ...

  6. Python正则表达式,统计分析nginx访问日志

    目标: 1.正则表达式 2.oop编程,统计nginx访问日志中不同IP地址出现的次数并排序 1.正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  7. Unity3d ShaderLab之WorldNormalVector

    首先来看看Unity 3d官方文档上对WorldNormalVector的解释: float3 worldNormal; INTERNAL_DATA - will contain world norm ...

  8. Nginx Image Module图片缩略图 水印处理模块

    Nginx Image Module图片缩略图 水印处理模块 下载Tengine tar -zxvf tengine-1.4.5.tar.gz cd tengine-1.4.5 下载Nginx tar ...

  9. 程序ajax请求公共组件app-jquery-http.js中url参数部分的项目应用

    结合微信登录以及微信支付的案例:= =||| (案例比较奇葩复杂) 简述项目流程: 1.获取用于公众号支付的openid(公众平台):在微信内置浏览器中打开网页链接,刚进入页面就通过微信公众平台获取该 ...

  10. NULL、nil、Nil、NSNull的区别

    标志 值 含义 NULL (void *)0 C指针的字面零值 nil (id)0 Objecve-C对象的字面零值 Nil (Class)0 Objecve-C类的字面零值 NSNull [NSNu ...