我一直认为"throw"和"throw ex"之间的区别在于,仅使用"throw"无法重置异常的堆栈跟踪。这里有相关讨论。
不幸的是,我的实际情况与此不符;以下是一个简单的示例,可以重现我的问题:
我期望这段代码从第14行开始打印调用堆栈;然而,调用堆栈从第18行开始。在这个示例中当然没什么大不了的,但在我的实际应用程序中,丢失初始错误信息是非常痛苦的。
我是否漏掉了一些明显的东西?还有其他方法可以实现我想要的(即重新抛出异常而不丢失堆栈信息)?
我正在使用 .net 3.5
不幸的是,我的实际情况与此不符;以下是一个简单的示例,可以重现我的问题:
using System;
using System.Text;
namespace testthrow2
{
class Program
{
static void Main(string[] args)
{
try
{
try
{
throw new Exception("line 14");
}
catch (Exception)
{
throw; // line 18
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}
我期望这段代码从第14行开始打印调用堆栈;然而,调用堆栈从第18行开始。在这个示例中当然没什么大不了的,但在我的实际应用程序中,丢失初始错误信息是非常痛苦的。
我是否漏掉了一些明显的东西?还有其他方法可以实现我想要的(即重新抛出异常而不丢失堆栈信息)?
我正在使用 .net 3.5
typeof(Exception).GetMethod("InternalPreserveStackTrace", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(ex, null);
- Derek Kalweit