文章目录:

  1. 异常概述
  2. CLR中的异常处理机制
  3. CLR中异常的核心类System.Exception类
  4. 异常处理的设计规范和最佳实践
  5. 异常处理的性能问题
  6. 其他拓展

1、异常概述

  异常我们通常指的是行动成员(例如类实例对象)没有完成所宣称的行动或任务。

  例如下图中代码,返回 "Lmc"这个字符串的第二个字符的大写是否为 "M",假如这个执行过程中任何一个步骤出错,都应该返回一个状态(例如"L".Substring(1,1)会因为字符串索引不够长而出现异常),指示代码不能正常进行完成行动,但是以下这句代码是没有办法返回的,所以.net framework 使用异常处理来解决这个问题,抛出特定异常("L".Substring(1,1)会抛出ArgumentOutOfRangeException异常)。

浅析CLR的异常处理模型

2、CLR中的异常处理机制

  C#中的异常处理机制是使用try , catch ,finally关键字来包裹代码,捕获异常,以及执行恢复清理操作。使用规范是try块中写入正常执行/需要清理的代码,catch块捕获特定异常,执行回复操作,finally块执行清理代码。

  其中catch块会优先捕捉特定的异常。例如try块抛出异常,CLR会搜索与try块同级的,捕捉类型与throw类型相同的的catch块,假如没有找到,CLR会调用栈更高的一层去搜索与异常类型相匹配的catch块。假如到了调用栈顶部,依旧没有找到匹配的catch块,就会发生无处里的异常。

  当CLR找到匹配的catch块,就会执行内层所有finally块代码,然后执行catch块,执行与捕获catch块相同级的finally代码。 如下如所示:

 1         private static void Exfun1()
 2         {
 3             try
 4             {
 5                 Exfun2();
 6             }
 7             catch(Exception ex)
 8             {
 9                 Console.WriteLine($" this is Exfun1  Exception : {ex.StackTrace}");  //3 
10             }
11             finally
12             {
13                 Console.WriteLine("this is Exfun1 finally");  //4
14             }
15         }
16         private static void Exfun2()
17         {
18             try
19             {
20                 Console.WriteLine("this is Exfun2");   //1 
21                 throw new IOException();
22             }
23             catch(InvalidCastException ex)
24             {
25                 Console.WriteLine($"this is Exfun2 InvalidCastException {ex.Message}");  //由于捕获的异常与抛出的异常不匹配,所以不执行
26             }
27             finally
28             {
29                 Console.WriteLine("this is Exfun2 finally"); //2  由于是在Exfun1中的catch捕获到异常,所以先执行内层的catch块。
30             }
31         }
View Code

相关文章:

  • 2021-09-02
  • 2021-08-10
  • 2021-11-30
  • 2021-12-25
  • 2022-12-23
  • 2021-05-11
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-18
  • 2021-12-24
  • 1970-01-01
  • 2021-11-12
  • 2021-11-11
  • 2022-02-28
相关资源
相似解决方案