首页 新闻 会员 周边

throw 和throw ex的问题

1
悬赏园豆:50 [待解决问题]

最近突然想看下throw和throw ex的区别。
之前我的理解是thow ex会重置堆栈的信息,而以下的代码说明了这点:

static class Program
{
    static void Main(string[] args)
    {
        try
        {
            ThrowException1();
        }
        catch (Exception x)
        {
            Console.WriteLine("Exception 1:");
            Console.WriteLine(x.StackTrace);
        }

    }

    private static void ThrowException1()
    {
        try
        {
            DivByZero();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private static void DivByZero()
    {
        int x = 0;
        int y = 1 / x;
    }
}

throw ex 的确是这样。

但是当代码换成如下的方式的时候,却发现throw 和throw ex都替换了堆栈的信息,使得无法知道是哪一行发生异常。

static class Program
{
    static void Main(string[] args)
    {
        try
        {
            ThrowException1();
        }
        catch (Exception x)
        {
            Console.WriteLine("Exception 1:");
            Console.WriteLine(x.StackTrace);
        }

    }

    private static void ThrowException1()
    {
        try
        {
            int x = 0;
            int y = 1 / x;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    } 
}

前后代码的区别就是:
前者发生异常的代码被一个方法DivByZero包了起来,然后try-catch的是对方法的调用;
后者则是try-catch的是发生异常的代码,没有方法的包裹。

为什么会这样呢?

a14907的主页 a14907 | 初学一级 | 园豆:157
提问于:2020-06-13 12:26
< >
分享
所有回答(2)
0

在 .NET Core 中测试,这2种写法的效果是一样的。

dudu | 园豆:30994 (高人七级) | 2020-06-13 15:45

上面的我在framework测试的

支持(0) 反对(0) a14907 | 园豆:157 (初学一级) | 2020-06-13 15:59
0

你问题里面的代码都是用 throw ex; 啊。用throw;就好了

sweetjian | 园豆:276 (菜鸟二级) | 2020-08-22 15:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册