【.net 深呼吸】细说CodeDom(10):生成异常处理语句
写完这一篇,大概可以准备过年了,就算是这系列文章的收尾吧。
异常处理语句,就是常说的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):生成异常处理语句的更多相关文章
- 【.net 深呼吸】细说CodeDom(8):分支与循环
有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- 将表里的数据批量生成INSERT语句的存储过程 继续增强版
文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...
- 通过存储过程批量生成spool语句
过存储过程批量生成spool语句 CREATE OR REPLACE PROCEDURE pro_yx_full_txt IS export_handle UTL_FILE.file_type; v_ ...
- Java 自定义注解及注解读取解析--模拟框架生成SQL语句
假设们使用一张简单的表,结构如下: 定义注解: 表注解: package com.xzlf.annotation; import java.lang.annotation.ElementType; i ...
- 未找到数据,异常处理:exception when no_data_found then 异常处理语句;
未找到数据. 在 select 字段 Into 变量 from 表 where 条件: 这种语句中很有可能会有select 不到数据的问题,导致报错"未找到数据" 要解决这种问题需 ...
- 将表里的数据批量生成INSERT语句的存储过程
有时候,我们需要将某个表里的数据全部导出来,迁移到另一个相同结构的库中,这里可以采取一个简便的方法,通过一个存储过程批量导出数据并生成SQL语句,非常方便.存储过程如下: )) as begin de ...
- 利用反射自动生成SQL语句(仿Linq)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...
- Excel数据生成Sql语句的方法
选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可 代码如下 复制代码 ,=CONCATENA ...
随机推荐
- gulp用法
转载:http://segmentfault.com/blog/laopopo/1190000000372547 http://javascript.ruanyifeng.com/tool/gulp. ...
- Spring第一个例子的补充
1.首先导入需要的包: 2.文件结构: 3.先看xml配置文件: <?xml version="1.0" encoding="UTF-8"?> &l ...
- [Unity]C#中 将XML和实体类之间进行相互转换的工具类
using System; using System.Xml; using System.Xml.Serialization; using System.IO; namespace LOTool { ...
- [iOS] 响应式编程开发-ReactiveCocoa(一)
什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...
- XML&AJAX
AJAX: Asynchronous Javascript and XML 1. 客户端触发异步操作 2. 创建新的XMLHttpRequest, 是重要的js对象,通过它提起对服务器端的请求 3. ...
- 用PS给图标添加外发光效果
最近在做app的时候用到了图标需要根据点击和非点击显示两种状态(原始状态和外发光状态). 如下图: 没办法,因为这是毕业设计的东西,总不能叫同事帮忙处理下.所以自己充当了回美工. 做法如下: 1.打开 ...
- .htaccess 使用大全
重新和重定向 注意:首先需要服务器安装和启用mod_rewrite模块. 强制 www RewriteEngine on RewriteCond %{HTTP_HOST} ^example\.com ...
- php管理关系工具Composer 之安装与下载
参考网址:http://www.phpcomposer.com https://packagist.org 1.linux 安装Composer curl -sS https://getcompose ...
- MySQL5.6-Tomcat7环境变量的配置
一.MySQL环境变量配置(zip安装):系统-高级系统设置--环境变量--path添加D:\Mysql\bin 找到mysql解压目录下的my-default.ini文件修改 basedir = D ...
- 升级R版本后,更新Package
升级R版本后,若重新安装所有的package将非常麻烦,可以尝试运行一下程序: 1)在旧版本中的R中运行 #--run in the old version of R setwd("C:/T ...