刚才测试throw 在.net4.0上,重置了异常起始点
1 void Ex1() 2 { 3 try 4 { 5 throw new Exception("拉拉 ,我出粗了1111111111111"); 6 } 7 catch //(Exception ex) 8 { 9 throw; 10 //throw new Exception("0000000000", ex); 11 } 12 }
调用方法Ex1 捕获异常.得到的堆栈信息是在行9出错.而不是在行5.
求解释
throw e重新创建调用栈,throw能保留原始调用栈, 但并非不改变调用栈。 你的这个例子里只有一个函数,所以看不出差异。稍微典型一点的例子是这样的。
public static void Main(string[] args) { try { ex1(); } catch (Exception e) { Console.WriteLine(e.StackTrace); } } static void ex2() { throw new Exception(); } static void ex1() { try { ex2(); } catch (Exception e) { Console.WriteLine(e.StackTrace); Console.WriteLine(); Console.WriteLine(); //throw e; throw ; } }
看下函数ex1种使用 throw 和 throw e的区别就知道了。 简单的讲,throw 能看到最初出异常的函数,而throw e是不知道最原始出异常的函数的,不方便问题定位。
因为 对于catch来说异常在行5.
但catch把异常捕捉了.这时候ex1是没有异常的.
然后行9就抛出来了.所以对ex1来说异常在行9
好吧,理解错误.坑爹