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偵錯本身是一個重要的主題,因此在接下來的教學中,將在單獨一篇文章討論它。