首页 新闻 会员 周边 捐助

刚才测试throw 在.net4.0上,重置了异常起始点

0
悬赏园豆:10 [已解决问题] 解决于 2014-05-01 14:28

刚才测试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.

求解释

czd890的主页 czd890 | 专家六级 | 园豆:14488
提问于:2014-04-21 17:46
< >
分享
最佳答案
0

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是不知道最原始出异常的函数的,不方便问题定位。

收获园豆:5
天方 | 大侠五级 |园豆:5432 | 2014-04-22 21:55
其他回答(1)
0

因为 对于catch来说异常在行5.

但catch把异常捕捉了.这时候ex1是没有异常的.

然后行9就抛出来了.所以对ex1来说异常在行9

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-21 18:09

好吧,理解错误.坑爹

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2014-04-21 18:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册