c# – 什么可以导致重置一个callstack(我使用“throw”,而不是“throw ex”)

我一直认为“抛出”和“抛出前”was that throw alone wasn’t resetting the stacktrace of the exception.之间的区别

不幸的是,这不是我遇到的行为;这里是一个简单的例子来说明我的问题:

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行开始打印一个callstack;然而,callstack从第18行开始。当然,样例中没有什么大不了的,但在我的现实生活中,丢失初始错误信息是相当痛苦的。

我错过了什么吗?是否有另一种方式来实现我想要的(即重新抛出异常而不丢失堆栈信息?)

我正在使用.net 3.5

你应该阅读这篇文章:

> Rethrowing exceptions and preserving the full call stack trace

简而言之,throw通常保留原始抛出异常的堆栈跟踪,但只有当当前堆栈帧(即方法)中没有发生异常时。

您使用的方法PreserveStackTrace(在该博客文章中显示)保留原始堆栈跟踪,如下所示:

try
{

}
catch (Exception ex)
{
    PreserveStackTrace(ex);
    throw;
}

但是我通常的解决方案是简单地不要抓住并重新抛出这样的异常(除非绝对必要),或者只是总是使用InnerException属性抛出新的异常来传播原始异常:

try
{

}
catch (Exception ex)
{
     throw new Exception("Error doing foo", ex);
}
http://stackoverflow.com/questions/5152265/what-can-lead-throw-to-reset-a-callstack-im-using-throw-not-throw-ex

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 什么可以导致重置一个callstack(我使用“throw”,而不是“throw ex”)