ASP.NET錯誤管理

ASP.NET中的錯誤處理有三個方面:

  • 跟蹤 - 在頁面級別或應用程式級別跟蹤程式執行。
  • 錯誤處理 - 處理頁面級別或應用程式級別的標準錯誤或自定義錯誤。
  • 調試 - 逐步完成程式,設置中斷點來分析代碼。

在本章中,我們將討論跟蹤,錯誤處理以及調試。

要理解這些概念,創建一個ASP.Net空網站專案:ErrorHandling 。 它有一個標籤控件,一個下拉列表和一個鏈接。 下拉列表加載名人名言的數組列表,所選引用顯示在下面的標籤中。它也有超鏈接,但是指向一個不存在的鏈接(僅作為示例演示)。參考以下代碼(Default.aspx) -

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>ASP.Net錯誤處理示例</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="lblheading" runat="server" Text="跟蹤,調試和錯誤處理">
            </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.html">鏈接到:</asp:HyperLink>
         </div>
    </form>
</body>
</html>

以下是Default.aspx.cs 的代碼 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

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("{1}, 名言: {0}", ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue);
        }
    }
}

運行上面示例代碼,得到以下結果 -

跟蹤

要啟用頁面級別跟蹤,需要修改Page指令並添加Trace屬性,如下所示:

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

現在當執行這個檔時,就會得到以下跟蹤資訊:

它在頂部提供以下資訊:

  • 會話ID
  • 狀態碼
  • 請求時間
  • 請求類型
  • 請求和回應編碼

每次請求頁面時,伺服器發送的狀態碼顯示錯誤的名稱和時間(如果有的話)。 下表顯示了常見的HTTP狀態代碼:

狀態碼 描述
100 繼續
101 切換協議
200 完成
204 無內容
301 永久轉移
305 使用代理
307 臨時重定向
400 錯誤的請求
402 需要抵消
404 未找到
408 請求超時
417 未實現預期
500 內部伺服器錯誤
503 服務不可用
505 HTTP版本不受支持

在頂級資訊下麵有Trace日誌,提供頁面生命週期的細節。它提供自頁面初始化以來經過的時間(秒)。如下圖所示 -

下一個資訊塊是控制樹,它以分層的方式列出頁面上的所有控件:

最後在會話和應用程式狀態摘要,Cookie和標題集合之後列出所有伺服器變數。

跟蹤對象允許將自定義資訊添加到跟蹤輸出。 它有兩個方法來完成這個操作:Write方法和Warn方法。

更改Page_Load事件處理程式以使用Write方法記錄程式執行過程:

Trace.Write("頁面已經開始加載...");
        if (!IsPostBack)
        {
            Trace.Write("Not Post Back, Page Load");
            ......

運行觀察效果:

要使用Warn方法,可在選擇的索引更改的事件處理程式中強制輸入一些錯誤的代碼:

        // 強制拋出錯誤
        try
        {
            int a = 0;
            int b = 9 / a;
        }catch (DivideByZeroException e1)
        {
            Trace.Warn("UserAction", "processing 9/a", e1);
        }

Try-Catch是一個C# 編程結構。 try塊保存任何可能產生錯誤或者不產生錯誤的代碼,catch塊捕獲錯誤。 程式運行時,會在跟蹤日誌中發送警告。

應用程式級別跟蹤適用於網站中的所有頁面。 它通過在web.config檔中放入以下代碼行來實現:

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

錯誤處理

雖然ASP.NET可以檢測到所有的運行時錯誤,但仍然有一些細微的錯誤。 通過跟蹤觀察錯誤是為了方便開發人員發現程式問題,而不是為了用戶。
因此,為了截獲這種情況,可以在應用程式的web.config檔中添加錯誤處理設置。 這是應用程式範圍的錯誤處理。 例如,可以在web.config檔中添加以下行:

<configuration>
   <system.web>

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

   </system.web>
<configuration>

<customErrors>部分可能有的屬性:

  • Mode - 它啟用或禁用自定義錯誤頁面。它有三個可能的值:
    • On - 顯示自定義頁面。
    • Off - 顯示ASP.NET錯誤頁面
    • remoteOnly - 它向客戶端顯示自定義錯誤,在本地顯示ASP.NET錯誤。
  • defaultRedirect - 它包含在未處理的錯誤情況下顯示的頁面的URL。

為了針對不同類型的錯誤放置不同的自定義錯誤頁面,根據錯誤的狀態代碼使用<error>子標記,其中指定了不同的錯誤頁面。
要實現頁面級錯誤處理,可以修改Page指令:

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

由於ASP.NET調試本身是一個重要的主題,因此在接下來的教學中,將在單獨一篇文章討論它。


上一篇: ASP.NET個性化 下一篇: ASP.NET調試