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

异常处理语句,就是常说的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. [iOS]C语言技术视频-15-指针变量高级用法练习一(函数指针完成动态排序)

    下载地址: 链接: http://pan.baidu.com/s/1o6MOzX4 密码: xzxn

  2. xml 解析 python

    1 综述 有很多种解析方法. (1)  DOM   缺点是:1 不能解析格式不正确或者不规则xml  2据说只能解析utf-8格式,非utf-8需要转码 与SAX比较,DOM典型的缺点是比较慢,消耗更 ...

  3. Netbeans 6.8 + apktool_2.0.0b9 动态调试smali文件

    前言 很早就知道用Netbeans能够单步调试smali,一直拖到现在才真正的自己实现了一次~ 下面是详细步骤! 0×1 环境及工具 a.apktool_2.0.0b9 下载地址:http://con ...

  4. 一个简单但详细的解释Windows文件映射读取数据文件的例子

    #include <windows.h>#include <string.h>#include <string>#include <iostream>u ...

  5. Android init.rc文件浅析

    Android init.rc文件浅析 分类: Android2012-04-13 18:00 13149人阅读 评论(2) 收藏 举报 androidservicepathactionsocketc ...

  6. php 语法中有 let 吗?

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

  7. DIV+CSS 常见问题及解决办法整理

    http://blog.shaogroup.com/divcss-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E8%A7%A3%E5%86%B3%E5% ...

  8. Cocos2dx 学习笔记整理----第一个项目

    接上一节, 进入新建的项目下面的proj.win32下面,找到项目名.sln文件(我的是game001.sln),双击会通过VS2010打开.(当然,你装了VS什么版本就是什么版本) 将你的项目设为启 ...

  9. linux 驱动入门6

    看/sys目录经常看到bus device driver class. 这也是网上大量说的驱动驱动模型.这些的关系得熟悉得明白吧.是的.今天我先不整他们的关系.先逐个击破,然后再统一来理清楚他们之间的 ...

  10. Spring自学教程-注解的使用(三)

    一.java中的注解 定义注解 下面是一个定义注解的实例. @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documente ...