获取try..catch中的Exception对象以包含FULL stacktrace,当前它被截断

有人可以帮忙吗?

我试图在try..catch的捕获中获得完整的堆栈跟踪。 目前它被截断为仅包含错误所在的当前方法….

让我解释..目前我的堆栈跟踪包括方法“第三”,其中错误发生但第一和第二不包括在内,我相信这是设计的。

private void First() { this.Second(); } private void Second() { this.Third(); } private void Third() { try { throw new SystemException("ERROR HERE!"); } catch (Exception ex) { // I WILL LOG THE EXCEPTION object "EX" here ! but ex.StackTrace is truncated! } } 

我已经看到了在STRING中获得完整堆栈跟踪的一些技巧,但问题是我的日志框架需要一个类型为“Exception”的对象,但是我的exception的变量(ex)是有效的但是属性StackTrace被截断了。

无论如何我有一个完整的堆栈跟踪可以收到一个完整的exception,所以我仍然可以发送我的“EX”,但这次它将有一个UNtruncated堆栈跟踪。

UnhandledErrror事件似乎工作就好像我到达这里Exception有一个堆栈跟踪并完全填充…

我真的很感激任何反馈..

 class Program { static void Main(string[] args) { try { First(); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } Console.ReadLine(); } private static void First() { Second(); } private static void Second() { Third(); } private static void Third() { throw new SystemException("ERROR HERE!"); } } 

这种情况下的输出是:

  at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 37 at stack.Program.Second() in C:\Temp\customers\stack\Program.cs:line 31 at stack.Program.First() in C:\Temp\customers\stack\Program.cs:line 25 at stack.Program.Main(String[] args) in C:\Temp\customers\stack\Program.cs:li ne 14 

更新:我突然怀疑,并贯穿到目前为止提出的所有解决方案。 虽然Environment.StackTrace是最简单的,但它们都有效。 这是输出的样子:

 ==ex.StackTrace== at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35 ==Environment.StackTrace per Guillaume/Jorge Córdoba== at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35 at S ystem.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace() at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 44 at stack.Program.Second() in C:\Temp\customers\stack\Program.cs:line 27 at stack.Program.First() in C:\Temp\customers\stack\Program.cs:line 21 at stack.Program.Main(String[] args) in C:\Temp\customers\stack\Program.cs:li ne 15 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySec urity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C ontextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() ==ex.ToString() per danyolgiax== System.SystemException: ERROR HERE! at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35 ==GetFrame(i) per MBen== Void Third(): (line 52) Void Second(): (line 27) Void First(): (line 21) Void Main(System.String[]): (line 15) Int32 _nExecuteAssembly(System.Reflection.Assembly, System.String[]): (line 0) Int32 ExecuteAssembly(System.String, System.Security.Policy.Evidence, System.Str ing[]): (line 0) Void RunUsersAssembly(): (line 0) Void ThreadStart_Context(System.Object): (line 0) Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, Sy stem.Object): (line 0) Void ThreadStart(): (line 0) 
 string fullStackTrace = exception.StackTrace + Environment.StackTrace; 

当前方法可以添加两次,如果是这样,从其中一个属性中删除一行。

你需要这样的东西:

  private static void Third() { try { throw new SystemException("ERROR HERE!"); } catch (Exception ex) { // I WILL LOG THE EXCEPTION object "EX" here ! but ex.StackTrace is truncated! StackTrace st = new StackTrace(true); for (int i = 0; i < st.FrameCount; i++) { // Note that high up the call stack, there is only // one stack frame. StackFrame sf = st.GetFrame(i); Console.WriteLine(); Console.WriteLine("High up the call stack, Method: {0}", sf.GetMethod()); Console.WriteLine("High up the call stack, Line Number: {0}", sf.GetFileLineNumber()); } } } 

有关更多信息,请查看此文章: StackStace类

希望这可以帮助。

你不明白堆栈跟踪是如何工作的。 exception跟踪中包含的内容是“路由”简短说明exception已经到达您正在处理它的点。

因此,在你的例子中,它还没有完全旅行,它仍然处于“第三”方法。 如果它会冒泡到“第二”,那么它将经历第三个,到第二个,你将在堆栈跟踪上得到它。

我想你真正想要的是CallStack 。 是相同的概念,但是exception中包含的跟踪实际上包括“向后”排序,因为exception“向上”行进到处理它的地方。

尝试记录处理exception的CallStack。