我一直认为“抛出”和“抛出前”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);
}
相关文章
转载注明原文:c# – 什么可以导致重置一个callstack(我使用“throw”,而不是“throw ex”) - 代码日志