我有一个asp.net应用程序,如果代码中有异常,我会抓住它将一些细节(堆栈跟踪,异常详细信息等)记录到数据库并将引用代码返回给客户端。
我注意到死机的ASP.Net黄色屏幕在违规行以及堆栈跟踪周围显示了几行代码。
我想记录那个"源错误:"太。 ASP.net在哪里以及如何获得"源错误:"源代码来自?
答案 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行。