最近突然想看下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的是发生异常的代码,没有方法的包裹。
为什么会这样呢?
在 .NET Core 中测试,这2种写法的效果是一样的。
上面的我在framework测试的
你问题里面的代码都是用 throw ex; 啊。用throw;就好了