65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 应用程序未处理异常的错误页面

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.56/5 (10投票s)

2006年6月14日

CPOL

2分钟阅读

viewsIcon

63221

downloadIcon

1045

每个应用程序都需要向用户显示友好的错误消息,以及异常详情和开发者所需的堆栈跟踪。 在本文中,我将展示如何显示用户友好的错误消息。

引言

每个应用程序都需要在出现问题时显示友好的消息,以及异常详情和开发者所需的堆栈跟踪。 在本文中,我将展示如何显示用户友好的错误消息。

解决方案

有很多组成部分,并且很容易将它们组合在一起。 以下是组成部分:

  • Message 类:它存储你需要向开发者显示的消息详情。
  • Global.asax:捕获未处理的错误;对于每个未处理的异常,都会触发 Application_Error 事件。
  • 错误页面:用于向用户显示错误。
  • Web.config:最后但并非最不重要的一点,是将异常重定向到错误页面的设置。

Message 类是最简单的步骤;创建一个 Message 类,并添加 LastException 作为静态属性。 我稍后会在解释多线程问题时再讨论静态属性。 在 Global.asax 中,在 Application_Error 事件中,编写以下代码:

Message.LastException = Server.GetLastError().GetBaseException();
string message = "Error Caught in Application_Error event\n" +
        "Error in: " + Request.Url.ToString() +
        "\nError Message:" + Message.LastException.Message.ToString() +
        "\nStack Trace:" + Message.LastException.StackTrace.ToString();

第一行获取最后一个异常并将其保存在 Message 类的 LastException 属性中。 错误页面非常简单,包含一个链接以显示对开发者有用的消息详情。 项目代码已附上,请下载代码进行测试。 这是包含在超链接单击事件中的代码片段:

if (this.MessagePanel.Visible)
{
    this.MessagePanel.Visible = false;
    this.DetailLinkButton.Text = "Show Details";
}
else
{
    if (Message.LastException != null)
    {
        this.MessageTextBox.Text = "Error Caught in Application_Error event\n" +
            "Error in: " + Request.Url.ToString() +
            "\n\nError Message:" + Message.LastException.Message.ToString() +
            "\n\nStack Trace:" + Message.LastException.StackTrace.ToString();
    }
    else
    {
        //this should never happen.
        this.MessageTextBox.Text = "There is no exception.";
    } 
    this.MessagePanel.Visible = true;
    this.DetailLinkButton.Text = "Hide Details";
}

以上代码非常简单,并在文本框中显示异常详情。 Web.config:这是每个人都知道的事情,重定向到错误页面。

<customErrors mode="On" defaultRedirect="showError.aspx">
</customErrors>

将上述配置添加到 web.config 文件的 system.web 部分。

就这样,你的应用程序已准备好处理异常。 哦,关于多用户、线程问题。 由于 Message 类具有此静态属性,因此异常详情可能不正确。 可以通过同步来解决此问题,但除非你有数千个并发用户,否则你可能不需要它。

结论

我只是解释了一种显示异常的方法,还有数百万种其他方法可以做到同样的事情。

祝您编码愉快!

© . All rights reserved.