如何访问自定义错误页面中使用的异常的源错误,源文件和行号?

时间:2010-06-18 04:43:15

标签: c# asp.net exception-handling error-handling

基本上我想采取以下措施: alt text

并使其与应用程序其余部分的样式相匹配。

我在基于C#的项目中创建了一个自定义错误页面,我希望它能够显示ASP.NET默认错误页面中显示的相同信息。从摆弄反射器我可以看到这是通过HttpException.GetHtmlErrorMessage()生成的,但当我尝试在我的异常中使用它时,它返回null

4 个答案:

答案 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)

  
    

您不需要添加过滤器来执行事件获取,只需处理global.asax.cs中的Application_Error。 Server.GetLastError()将具有异常信息

  
是的,嗯......不。 原始问题中显示的错误显示解析/编译错误 - 这些错误发生在ASP.NET的HttpHandler管道中(较旧的IIS版本中的ISAPI筛选器),即之前您的应用程序是事件启动时,所以之前Global.asax中的任何事件。

虽然您可以指定自定义错误页面(在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错误都会记录到事件日志中。您可以尝试从事件日志中读取最后一个错误,并显示它是否已写入。

您还希望为事件抓取添加过滤器,以确保您显示应用程序中的事件,并且在很长一段时间内没有其他错误事件。