基本上我想采取以下措施:
并使其与应用程序其余部分的样式相匹配。
我在基于C#的项目中创建了一个自定义错误页面,我希望它能够显示ASP.NET默认错误页面中显示的相同信息。从摆弄反射器我可以看到这是通过HttpException.GetHtmlErrorMessage()
生成的,但当我尝试在我的异常中使用它时,它返回null
。
答案 0 :(得分:2)
Iain,
我使用此代码在自定义错误页面上执行类似操作。我不确定是否可以使用Exception对象显示导致错误的确切源代码区域,但我能够使用堆栈跟踪,其中包括行号和方法名称:
If Not IsPostBack Then
Dim ex As Exception = Server.GetLastError().GetBaseException()
lblExceptionMessage.Text = ex.Message.ToString()
lblStackTrace.Text = ex.StackTrace().Replace(System.Environment.NewLine, "<br />")
End If
您还可以使用ex.TargetSite来获取引发异常的方法名称。
HTH,
麦克
答案 1 :(得分:2)
这个答案有点陈旧,但现有的答案都没有真正涉及原始问题。我正在寻找类似的东西,找不到任何东西,所以这是我快速而肮脏的解决方案。
首先,需要实际分解堆栈跟踪并获得顶级框架。
var st = new System.Diagnostics.StackTrace(this.Exception, true);
var frame = st.GetFrame(0);
然后,需要读取帧引用的文件(注意,这只会起作用,我相信,如果PDB文件可用)并找出要显示的行。这是一个方法,如果传递异常会发回一个带有潜在行的字典。然后你可以随心所欲地美化它。
public Dictionary<int, string> GetFileInfo(Exception ex, int linesBefore, int linesAfter)
{
Dictionary<int, string> sb = new Dictionary<int, string>();
var st = new System.Diagnostics.StackTrace(ex, true);
var frame = st.GetFrame(0);
using (System.IO.StreamReader file = new System.IO.StreamReader(frame.GetFileName()))
{
if (file == null)
return sb;
int counter = 0;
int line = frame.GetFileLineNumber();
int lastline = line + linesAfter;
int firstline = line - linesBefore;
while (!file.EndOfStream && counter < lastline)
{
string str = file.ReadLine();
if (counter > firstline && !string.IsNullOrWhiteSpace(str))
sb.Add(counter, str);
counter++;
}
}
return sb;
}
答案 2 :(得分:1)
是的,嗯......不。 原始问题中显示的错误显示解析/编译错误 - 这些错误发生在ASP.NET的HttpHandler管道中(较旧的IIS版本中的ISAPI筛选器),即之前您的应用程序是事件启动时,所以之前Global.asax中的任何事件。您不需要添加过滤器来执行事件获取,只需处理global.asax.cs中的Application_Error。 Server.GetLastError()将具有异常信息
虽然您可以指定自定义错误页面(在web.config,machine.config或IIS元数据库中),但这些只能是HTML文件。
1)如果您只对代码中出现的异常感兴趣(即您的代码编译,然后抛出异常),那么您可以使用上面的Dan建议并处理Glocal.asax中的Application_Error事件。 / p>
如果你想处理ASP.NET异常(例如解析/编译错误,配置文件错误等),那么你需要挂钩(或替换)ASP.NET HttpHandler。
您可以通过编写自己的处理程序来包装现有的处理程序,并捕获任何异常,然后重定向到另一个错误页面。
您可以在web.config文件中指定处理程序(如果是全局处理程序,则指定machine.config)。
网上有一些关于如何做到这一点的好教程。 从这里开始尝试:http://msdn.microsoft.com/en-us/library/f3ff8w4a(VS.71).aspx
(主要问题是:要捕获解析/编译错误,你需要编写一个处理程序/过滤器,这是上面的 ASP.NET处理程序/过滤器(我相信))。
希望这有帮助, Dourn。
答案 3 :(得分:0)
我从未尝试过这样做,但所有IIS错误都会记录到事件日志中。您可以尝试从事件日志中读取最后一个错误,并显示它是否已写入。
您还希望为事件抓取添加过滤器,以确保您显示应用程序中的事件,并且在很长一段时间内没有其他错误事件。