[C#6] 8-异常增强
时间:2022-04-23
本文章向大家介绍[C#6] 8-异常增强,主要内容包括0. 目录、1. 在catch和finally块中使用await、2. 异常过滤器、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
0. 目录
C#6 新增特性目录
1. 在catch和finally块中使用await
在C#5中引入一对关键字await/async,用来支持新的异步编程模型,使的C#的异步编程模型进一步的简化(APM->EAP->TAP->await/async,关于C#中的异步编程模型的不是本篇文章的介绍重点,详细的资料请移步这里Asynchronous Programming Pattern)。在C#5中虽然引入了await/async,但是却有一些限制,比如不能再catch和finally语句块中使用,C#6中将不再受此限制。
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4
5 namespace csharp6
6 {
7 internal class Program
8 {
9 private static void Main(string[] args)
10 {
11 do
12 {
13 Log(ConsoleColor.White, "caller method begin", true);
14 CallerMethod();
15 Log(ConsoleColor.White, "caller method end");
16 } while (Console.ReadKey().Key != ConsoleKey.Q);
17 }
18
19 public static async void CallerMethod()
20 {
21 try
22 {
23 Log(ConsoleColor.Yellow, "try ", true);
24 throw new Exception();
25 }
26 catch (Exception)
27 {
28 Log(ConsoleColor.Red, "catch await begin", true);
29 await AsyncMethod();
30 Log(ConsoleColor.Red, "catch await end");
31 }
32 finally
33 {
34 Log(ConsoleColor.Blue, "finally await begin", true);
35 await AsyncMethod();
36 Log(ConsoleColor.Blue, "finally await end");
37 }
38 }
39
40 private static Task AsyncMethod()
41 {
42 return Task.Factory.StartNew(() =>
43 {
44 Log(ConsoleColor.Green, "async method begin");
45 Thread.Sleep(1000);
46 Log(ConsoleColor.Green, "async method end");
47 });
48 }
49
50 private static void Log(ConsoleColor color, string message, bool newLine = false)
51 {
52 if (newLine)
53 {
54 Console.WriteLine();
55 }
56 Console.ForegroundColor = color;
57 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
58 }
59 }
60 }
运行结果如下:
如果你细心的话会发现async method begin:6这一行的颜色居然不是我设置的绿色,而是白色,而且顺序也出现了错乱;而你再运行一次,它可能就是绿色了。这其实是由于我在Log方法(非线程安全的方法)里面的两行代码被多个线程争抢调用引起的:
1 Console.ForegroundColor = color;
2 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
我们可以做点小改动来让Log方法做到线程安全(在C#中有很多方式可以做到,这只是其中一种):
1 [MethodImpl(MethodImplOptions.Synchronized)]
2 private static void Log(ConsoleColor color, string message, bool newLine = false)
3 {
4 if (newLine)
5 {
6 Console.WriteLine();
7 }
8 Console.ForegroundColor = color;
9 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
10 }
貌似有点跑题了,回归正题,在catch和finally语句块中支持await关键字并不需要IL指令的支持,也不需要CLR的支持,而仅仅是编译器做出的代码转换(await/async就像lambda一样到delegate一样)。具体的IL就不做展开了,太庞大了,贴个图看下大致的情况:
2. 异常过滤器
其实这个语言特性在VB,F#里面早就支持了,现在C#6里面也可以使用了。
1 try { … }
2 catch (Exception e) when (filter(e))
3 {
4 …
5 }
其中when这一块就是异常过滤器生效的地方,when后面跟一个表达式,表达式结果如果为true,则进入当前catch语句块。
- Go语言中Socket通信TCP服务端
- MySQL和Oracle的添加字段的处理差别 (r10笔记第73天)
- MySQL修改数据类型的问题总结(r10笔记第74天)
- 深究|Elasticsearch单字段支持的最大字符数?
- Go语言中Socket通信之Tcp客户端
- Oracle 12c PDB迁移及ORA-00600错误分析和解决(r10笔记第72天)
- 【Go 语言社区】epoll详解
- Oracle 12c数据库升级实战(r10笔记第70天)
- Oracle 12c升级检查问题分析(r10笔记第69天)
- 转--使用Revel(go)开发网站
- GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
- Elasticsearch究竟要设置多少分片数?
- 设计模式(1)-使用简单工厂优化代码
- 简单易学的机器学习算法——因子分解机(Factorization Machine)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ESlint + stylelint + VSCode自动格式化代码(2020)
- PAT (Basic Level) Practice (中文)1032 挖掘机技术哪家强 (20 分)
- PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分)
- PAT (Basic Level) Practice (中文)1034 有理数四则运算 (20 分)
- 移动端开发的几点建议
- 数据结构题集(严书)图 常见习题代码
- PAT (Basic Level) Practice (中文)1036 跟奥巴马一起编程 (15 分)
- PAT (Advanced Level) Practice 1024 Palindromic Number (25 分)
- Flink 连接 hive 解决 java.net.UnknownHostException
- PAT (Advanced Level) Practice 1147 Heaps (30 分)
- Java自动化测试(app自动化环境搭建 31)
- PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
- 数据结构题集(严书)串 常见习题代码
- PAT (Basic Level) Practice (中文)1040 有几个PAT (25 分)
- 201909-4ccf计算机职业资格认证考试 第四题 推荐系统