Asp.net 简明教程

ASP.NET - Error Handling

ASP.NET 中的错误处理包含三个方面:

  1. Tracing - 跟踪页面或应用程序级别的程序执行。

  2. Error handling - 处理页面或应用程序级别的标准错误或自定义错误。

  3. Debugging - 单步执行程序,设置断点来分析代码。

在本章节中,我们将讨论跟踪和错误处理,在本章节中,我们将讨论调试。

要了解这些概念,请创建以下示例应用程序。它有一个标签控件、一个下拉列表和一个链接。下拉列表加载一个包含名言的数组列表,所选的名言会显示在下面的标签中。它还有一个指向不存在链接的超链接。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Tracing, debugging and error handling
      </title>
   </head>

   <body>
      <form id="form1" runat="server">

         <div>
            <asp:Label ID="lblheading" runat="server" Text="Tracing, Debuggin  and Error Handling">
            </asp:Label>

            <br /> <br />

            <asp:DropDownList ID="ddlquotes" runat="server" AutoPostBack="True"  onselectedindexchanged="ddlquotes_SelectedIndexChanged">
            </asp:DropDownList>

            <br /> <br />

            <asp:Label ID="lblquotes" runat="server">
            </asp:Label>

            <br /> <br />

            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="mylink.htm">Link to:</asp:HyperLink>
         </div>

      </form>
   </body>

</html>

文件背后的代码:

public partial class _Default : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      if (!IsPostBack)
      {
         string[,] quotes =
         {
            {"Imagination is more important than Knowledge.", "Albert Einsten"},
            {"Assume a virtue, if you have it not" "Shakespeare"},
            {"A man cannot be comfortable without his own approval", "Mark Twain"},
            {"Beware the young doctor and the old barber", "Benjamin Franklin"},
            {"Whatever begun in anger ends in shame", "Benjamin Franklin"}
         };

         for (int i=0; i<quotes.GetLength(0); i++)
            ddlquotes.Items.Add(new ListItem(quotes[i,0], quotes[i,1]));
      }
   }

   protected void ddlquotes_SelectedIndexChanged(object sender, EventArgs e)
   {
      if (ddlquotes.SelectedIndex != -1)
      {
         lblquotes.Text = String.Format("{0}, Quote: {1}", ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue);
      }
   }
}

Tracing

要启用页面级跟踪,需要修改页面指令并添加 Trace 属性,如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
   Inherits="errorhandling._Default" Trace ="true" %>

现在,当你执行文件时,你将获得跟踪信息:

tracing info

它在顶部提供以下信息:

  1. Session ID

  2. Status Code

  3. Time of Request

  4. Type of Request

  5. Request and Response Encoding

每次请求页面时,服务器返回的状态代码,如有错误,将显示错误名称和时间。下表显示了常见的 HTTP 状态代码:

Number

Description

Informational (100 - 199)

100

Continue

101

Switching protocols

Successful (200 - 299)

200

OK

204

No content

Redirection (300 - 399)

301

Moved permanently

305

Use proxy

307

Temporary redirect

Client Errors (400 - 499)

400

Bad request

402

Payment required

404

Not found

408

Request timeout

417

Expectation failed

Server Errors (500 - 599)

500

Internal server error

503

Service unavailable

505

在顶级信息下方,有跟踪日志,提供页面生命周期的详细信息。它提供自页面初始化以来经过的秒数。

tracing info2

下一部分是控件树,它以分层方式列出页面上的所有控件:

tracing info3

最后是会话和应用程序状态汇总、Cookie 和标头集合,后跟所有服务器变量的列表。

跟踪对象允许你在追踪输出中添加自定义信息。它有两种方法来完成此操作:Write 方法和 Warn 方法。

将 Page_Load 事件处理程序更改为检查 Write 方法:

protected void Page_Load(object sender, EventArgs e)
{
   Trace.Write("Page Load");

   if (!IsPostBack)
   {
      Trace.Write("Not Post Back, Page Load");
      string[,] quotes =
      .......................
   }
}

运行以观察效果:

tracing info4

要检查 Warn 方法,让我们强制在所选索引更改事件处理程序中输入一些错误代码:

try
{
   int a = 0;
   int b = 9 / a;
}catch (Exception e)
{
   Trace.Warn("UserAction", "processing 9/a", e);
}

Try-Catch 是一个 C# 编程结构。try 块容纳可能产生错误或可能不产生错误的任何代码,而 catch 块捕获错误。当程序运行时,它会在跟踪日志中发送警告。

tracing info5

应用程序级跟踪适用于网站中的所有页面。它通过在 web.config 文件中添加以下代码行来实现:

<system.web>
   <trace enabled="true" />
</system.web>

Error Handling

虽然 ASP.NET 可以检测所有运行时错误,但一些细微的错误可能仍然存在。通过跟踪观察错误是为开发人员准备的,而不是用户。

因此,为了拦截这种事件,可以在应用程序的 web.config 文件中添加错误处理设置。这是应用程序范围的错误处理。例如,可以在 web.config 文件中添加以下行:

<configuration>
   <system.web>

      <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
         <error statusCode="403" redirect="NoAccess.htm"	/>
         <error statusCode="404" redirect="FileNotFound.htm" />
      </customErrors>

   </system.web>
<configuration>

<customErrors> 部分具有可能出现的属性:

  1. Mode :它启用或禁用自定义错误页面。它有三个可能的值: On :显示自定义页面。 Off :显示 ASP.NET 错误页面(黄色页面) remoteOnly :它向客户端显示自定义错误,并在本地显示 ASP.NET 错误。

  2. defaultRedirect :它包含在出现未处理错误时要显示的页面的 URL。

要为不同类型的错误放置不同的自定义错误页面,将使用 <error> 子标记,其中根据错误的状态代码指定不同的错误页面。

要实现页面级别错误处理,可以修改 Page 指令:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
   Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>

因为 ASP.NET 调试是一个重要主题,因此我们将在下一章单独进行讨论。