在面试的过程中提到了异常捕获的的几种用法,之前一直使用但是没有仔细留意,调试程序的过程中发现还是有区别的,主要区别在堆栈信息的起始点不同,下边我们通过实例来看这集中不同的抛出异常的方法。
一般我们推荐throw来抛出异常,使用throw ex来抛出异常会清空存储的异常信息,认为已经处理过异常,只不过在抛出的过程中又产生的新的异常信息,从而找不到真正的错误源。
第一种 使用的人数最多,但是不推荐使用,这样处理异常程序会清空堆栈中的异常信息,在堆栈中重置异常点。
1 try 2 { 3 } 4 catch (Exception ex) 5 { 6 throw ex; 7 }
第二种 这种会追溯到异常的起源点,但是程序会报 定义的ex未被使用的警告
1 try 2 { 3 } 4 catch (Exception ex) 5 { 6 throw; 7 }
第三种 这中方式和第二种相同 可以捕获所有的异常,IDE也不会警告
1 try 2 { 3 } 4 catch 5 { 6 throw; 7 }
第四种 对异常重新包装,但同时保留了异常的起源点。
1 try 2 { 3 } 4 catch (Exception ex) 5 { 6 throw new Exception("经过进一步包装的异常", ex); 7 }
下边我们看具体使用过成中各种抛出异常的使用方法,对各种方法就会有了清晰的认识
1 using System; 2 3 namespace Throw 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 ExceptionClass ec = new ExceptionClass(); 10 11 try 12 { 13 ec.ExceptionThrow1(); 14 } 15 catch (Exception ex) 16 { 17 18 Console.WriteLine(ex.ToString()); 19 } 20 Console.WriteLine("----------------------华丽的分割线---------------------------"); 21 try 22 { 23 ec.ExceptionThrow2(); 24 } 25 catch (Exception ex) 26 { 27 28 Console.WriteLine(ex.ToString()); 29 } 30 Console.WriteLine("----------------------华丽的分割线---------------------------"); 31 try 32 { 33 ec.ExceptionThrow3(); 34 } 35 catch (Exception ex) 36 { 37 38 Console.WriteLine(ex.ToString()); 39 } 40 Console.WriteLine("----------------------华丽的分割线---------------------------"); 41 try 42 { 43 ec.ExceptionThrow4(); 44 } 45 catch (Exception ex) 46 { 47 48 Console.WriteLine(ex.ToString()); 49 } 50 Console.WriteLine("----------------------华丽的分割线---------------------------"); 51 52 Console.ReadKey(); 53 } 54 } 55 56 /// <summary> 57 /// 测试上下文抛出异常 相关上下文 栈的调用情况 58 /// </summary> 59 public class ExceptionClass 60 { 61 62 private void ExceptionMethod() 63 { 64 throw new DivideByZeroException(); 65 } 66 67 /// <summary> 68 /// 抛出异常的方法 69 /// </summary> 70 public void ExceptionThrow1() 71 { 72 try 73 { 74 this.ExceptionMethod(); 75 } 76 catch (Exception ex) 77 { 78 throw ex; 79 } 80 } 81 82 public void ExceptionThrow2() 83 { 84 try 85 { 86 this.ExceptionMethod(); 87 } 88 catch (Exception ex) 89 { 90 91 throw; 92 } 93 } 94 95 public void ExceptionThrow3() 96 { 97 try 98 { 99 this.ExceptionMethod(); 100 } 101 catch (Exception) 102 { 103 104 throw; 105 } 106 } 107 108 public void ExceptionThrow4() 109 { 110 try 111 { 112 this.ExceptionMethod(); 113 } 114 catch (Exception ex) 115 { 116 117 throw new Exception("经过进一步包装的异常",ex); 118 } 119 } 120 } 121 }
程序运行结果