使用 StackTrace 获得更多跟 Exception 有关的信息 [转]
2008-11-12 17:01
537 查看
不知你有没有留意过ASP.net的异常,如下图:
请留意图中用红笔标的地方。那些数字标明出错处位于源代码文件的多少行。
但是,我们通过 Exception.StackTrace 是获得不了这个信息的。这个信息是如何获得呢?这就要用到下面两个类:
下面的代码就替我们扑捉了更多关于异常的信息:
一个扑捉的信息如下:
---- Stack Trace ----
WebErrorTestProject.WebForm1.Page_Load(sender As Objecte As EventArgs)
WebForm_GetError.aspx.cs: line 0018, col 13, IL 0016
System.Web.Util.CalliHelper.EventArgFunctionCaller(fp As IntPtro As Objectt As Objecte As EventArgs)
(unknown file): N 00015
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(sender As Objecte As EventArgs)
(unknown file): N 00033
System.Web.UI.Control.OnLoad(e As EventArgs)
(unknown file): N 00099
System.Web.UI.Control.LoadRecursive()
(unknown file): N 00047
System.Web.UI.Page.ProcessRequestMain(includeStagesBeforeAsyncPoint As BooleanincludeStagesAfterAsyncPoint As Boolean)
(unknown file): N 01436
这个扑捉的信息,还包含源代码文件,行号,列号。
通过这些错误信息,可以帮助我们更容易的解决问题。
请留意图中用红笔标的地方。那些数字标明出错处位于源代码文件的多少行。
但是,我们通过 Exception.StackTrace 是获得不了这个信息的。这个信息是如何获得呢?这就要用到下面两个类:
System.Diagnostics.StackTrace | 表示一个堆栈跟踪,它是一个或多个堆栈帧的有序集合。 |
System.Diagnostics.StackFrame | 表示当前线程的调用堆栈中的一个函数调用 |
public static string EnhancedStackTrace(Exception ex) { return EnhancedStackTrace(new StackTrace(ex, true)); } public static string EnhancedStackTrace(StackTrace st) { StringBuilder sb = new StringBuilder(); sb.Append(Environment.NewLine); sb.Append("---- Stack Trace ----"); sb.Append(Environment.NewLine); for (int i = 0; i < st.FrameCount; i++) { StackFrame sf = st.GetFrame(i); MemberInfo mi = sf.GetMethod(); sb.Append(StackFrameToString(sf)); } sb.Append(Environment.NewLine); return sb.ToString(); } public static string StackFrameToString(StackFrame sf) { StringBuilder sb = new StringBuilder(); int intParam; MemberInfo mi = sf.GetMethod(); sb.Append(" "); sb.Append(mi.DeclaringType.Namespace); sb.Append("."); sb.Append(mi.DeclaringType.Name); sb.Append("."); sb.Append(mi.Name); // -- build method params sb.Append("("); intParam = 0; foreach (ParameterInfo param in sf.GetMethod().GetParameters()) { intParam += 1; sb.Append(param.Name); sb.Append(" As "); sb.Append(param.ParameterType.Name); } sb.Append(")"); sb.Append(Environment.NewLine); // -- if source code is available, append location info sb.Append(" "); if (string.IsNullOrEmpty(sf.GetFileName())) { sb.Append("(unknown file)"); //-- native code offset is always available sb.Append(": N "); sb.Append(String.Format("{0:#00000}", sf.GetNativeOffset())); } else { sb.Append(System.IO.Path.GetFileName(sf.GetFileName())); sb.Append(": line "); sb.Append(String.Format("{0:#0000}", sf.GetFileLineNumber())); sb.Append(", col "); sb.Append(String.Format("{0:#00}", sf.GetFileColumnNumber())); if (sf.GetILOffset() != StackFrame.OFFSET_UNKNOWN) { sb.Append(", IL "); sb.Append(String.Format("{0:#0000}", sf.GetILOffset())); } } sb.Append(Environment.NewLine); return sb.ToString(); }
一个扑捉的信息如下:
---- Stack Trace ----
WebErrorTestProject.WebForm1.Page_Load(sender As Objecte As EventArgs)
WebForm_GetError.aspx.cs: line 0018, col 13, IL 0016
System.Web.Util.CalliHelper.EventArgFunctionCaller(fp As IntPtro As Objectt As Objecte As EventArgs)
(unknown file): N 00015
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(sender As Objecte As EventArgs)
(unknown file): N 00033
System.Web.UI.Control.OnLoad(e As EventArgs)
(unknown file): N 00099
System.Web.UI.Control.LoadRecursive()
(unknown file): N 00047
System.Web.UI.Page.ProcessRequestMain(includeStagesBeforeAsyncPoint As BooleanincludeStagesAfterAsyncPoint As Boolean)
(unknown file): N 01436
这个扑捉的信息,还包含源代码文件,行号,列号。
通过这些错误信息,可以帮助我们更容易的解决问题。
相关文章推荐
- 使用 StackTrace 获得更多跟 Exception 有关的信息
- 使用 StackTrace 获得更多跟 Exception 有关的信息 --http://blog.joycode.com/ghj/archive/2008/03/05/114925.aspx
- System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。
- 使用DataBaseMetaData对象获得有关数据库管理系统的各种信息
- 未处理 System.Reflection.ReflectionTypeLoadException Message="无法加载一个或多个请求的类型。有关更多信息,请检索LoaderExceptions属性。
- Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性
- 使用Perfmon和PAL工具查看Server性能--从性能监视器获得更多有用信息
- 解决"System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性" 方法
- symbian如何获得更多错误信息内容--ErrRD在真机上的使用
- 使用StackTrace类获取更详细的Exception信息
- Androin学习笔记二十一:wifi的简单使用方法----获得本机或主机信息
- 使用dbms_rowid包获得rowid的详细信息
- “windows不能在本地计算机启动Apache Tomcat. 有关更多信息,查阅系统事件日志。如果这是非Microsoft服务,请与服务厂商联系,并参考特定服务错误代码0.”
- 关于C#中如何使用wmi获得操作系统信息?
- java使用Xuggler获得视频时长,分辨率,高宽,码率等信息
- Android使用adb获得activity堆栈信息
- C#使用Directoryinfo类获得目录信息和属性的方法
- 正在进行调试的Web服务器进程已由Internet信息服务(IIS)终止。可以通过在IIS中配置应用程序池Ping设置来避免这一问题。有关更多详细信息,请参见“帮助”
- 使用NetworkInterface类获得网络接口信息