文章目录:
- 异常概述
- CLR中的异常处理机制
- CLR中异常的核心类System.Exception类
- 异常处理的设计规范和最佳实践
- 异常处理的性能问题
- 其他拓展
1、异常概述
异常我们通常指的是行动成员(例如类实例对象)没有完成所宣称的行动或任务。
例如下图中代码,返回 "Lmc"这个字符串的第二个字符的大写是否为 "M",假如这个执行过程中任何一个步骤出错,都应该返回一个状态(例如"L".Substring(1,1)会因为字符串索引不够长而出现异常),指示代码不能正常进行完成行动,但是以下这句代码是没有办法返回的,所以.net framework 使用异常处理来解决这个问题,抛出特定异常("L".Substring(1,1)会抛出ArgumentOutOfRangeException异常)。
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 }