如何获得"源错误"从像Asp.Net这样的堆栈跟踪呢?

时间:2014-03-25 21:36:21

标签: asp.net .net

我有一个asp.net应用程序,如果代码中有异常,我会抓住它将一些细节(堆栈跟踪,异常详细信息等)记录到数据库并将引用代码返回给客户端。

我注意到死机的ASP.Net黄色屏幕在违规行以及堆栈跟踪周围显示了几行代码。

Asp.Net Yellow Screen of Death showing "Source Error"

我想记录那个"源错误:"太。 ASP.net在哪里以​​及如何获得"源错误:"源代码来自?

1 个答案:

答案 0 :(得分:5)

编辑:如果您需要错误的文件名和行号,可以这样理解:

var exc = Server.GetLastError();
var frame = new StackTrace(exc, true).GetFrame(0);

var sourceFile = frame.GetFileName();
var lineNumber = frame.GetFileLineNumber();

// sourceFile = c:\path\to\source\file.aspx
// lineNumber = 123

参考:How does ASP.NET get line numbers in it's generic error handler


看起来.NET框架中负责获取源信息的代码是System.Web.FormatterWithFileInfo.GetSourceFileLines()

...
for (int i=1; ; i++) {
    // Get the current line from the source file
    string sourceLine = reader.ReadLine();
    if (sourceLine == null)
        break;

    // If it's the error line, make it red
    if (i == lineNumber)
        sb.Append("<font color=red>");

    // Is it in the range we want to display
    if (i >= lineNumber-errorRange && i <= lineNumber+errorRange) {
        fFoundLine = true;
        String linestr = i.ToString("G", CultureInfo.CurrentCulture);

        sb.Append(SR.GetString(SR.WithFile_Line_Num, linestr));
        if (linestr.Length < 3)
            sb.Append(' ', 3 - linestr.Length);
        sb.Append(HttpUtility.HtmlEncode(sourceLine));

        if (i != lineNumber+errorRange)
            sb.Append("\r\n");
    }

    if (i == lineNumber)
        sb.Append("</font>");

    if (i>lineNumber+errorRange)
        break;
}
...

基本上它只是打开源文件,并在错误中找到lineNumber引用的行,以及之前和之后的2行。