StackTraceを使用してExceptionに関する詳細情報を入手

5211 ワード


ASPに気づいたことがありますか?Netの異常は、次の図のようになります.
図の中で赤いペンで表記されているところに注意してください.これらの数値には、エラーがソースファイルの行数を示します.
しかし、私たちはExceptionを通じて.StackTraceではこの情報は入手できません.この情報はどのように得られますか?次の2つのクラスが使用されます.
System.Diagnostics.StackTrace
1つ以上のスタックフレームの秩序化された集合であるスタックトラッキングを表します.
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
このキャプチャされた情報には、ソースファイル、行番号、列番号も含まれています.
これらのエラーメッセージにより、問題の解決が容易になります.