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