zoukankan      html  css  js  c++  java
  • 使用 StackTrace 获得更多跟 Exception 有关的信息 http://blog.joycode.com/ghj/archive/2008/03/05/114925.aspx

    不知你有没有留意过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

    这个扑捉的信息,还包含源代码文件,行号,列号。

    通过这些错误信息,可以帮助我们更容易的解决问题。

  • 相关阅读:
    算法分析之最小子段求和
    算法分析之最大子段求和(二)
    算法分析之爬楼梯问题
    .net编码规则
    tensorflow mnist
    The tensorflow simplest calculate
    python opencv
    english
    opencv 图片识别
    随机概率
  • 原文地址:https://www.cnblogs.com/si812cn/p/1402706.html
Copyright © 2011-2022 走看看