您的位置:首页 > 其它

使用 StackTrace 获得更多跟 Exception 有关的信息

2008-03-05 10:16 471 查看
不知你有没有留意过ASP.net的异常,如下图:



请留意图中用红笔标的地方。那些数字标明出错处位于源代码文件的多少行。
但是,我们通过 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
这个扑捉的信息,还包含源代码文件,行号,列号。
通过这些错误信息,可以帮助我们更容易的解决问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐