在ASP.NET 中例外處理有三個面向:
Tracing - 在頁面層級或應用程式層級追蹤程式執行。
Error handling - 在頁面層級或應用程式層級解決標準錯誤或自訂錯誤。
Debugging - 在程式中前進,設定斷點來分析程式碼。
在這一章中,我們將討論tracing 和handling。並且在這一章中,我們將涉及debugging。
為了理解概念,請創建以下的樣本應用程式。它有一個label 控件,一個dropdown 列表和一個連結。 dropdown 清單載入了一個名言的array 清單並且被選擇的引用將顯示在下面的標籤中。它也擁有一個超鏈接,它指向一個不存在的鏈接。
<%@ 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) { string[,] quotes = { {"Imagination is more important than Knowledge.", "Albert Know 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}, 引用: {1}", ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue); } }}
為了允許頁面層級的追踪,你需要修改Page 指令並且如下新增一個Trace 屬性:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" %>
現在當你執行檔案時,你將得到追蹤資訊:
它在首部提供了以下的資訊:
Session ID
Status Code
Time of Request
Type of Request
Request and Response Encoding
每次頁面被需要時,從伺服器發出的status 代碼顯示名字和錯誤時間,如果有的話。以下的表格顯示普通的HTTP status 程式碼:
數位 | 描述 |
---|---|
通知(100 - 199) | |
100 | 繼續 |
101 | 轉換協定 |
成功(200 - 299) | |
200 | OK |
204 | 無內容 |
重定向(300 - 399) | |
301 | 永久移動 |
305 | 使用代理 |
307 | 暫時重定向 |
來自客戶端的錯誤(400 - 499) | |
400 | 錯誤請求 |
402 | 支付需求 |
404 | 未找到 |
408 | 請求超時 |
417 | 期望失敗 |
來自伺服器的錯誤(500 - 599) | |
500 | 內部伺服器錯誤 |
503 | 服務不可用 |
505 | HTTP 版本不支援 |
在頂級資訊下,有一個Trace 日誌,它提供了頁面生命週期的細節。它提供了頁面被初始化後的以秒為單位的運行時間。
下一個部分是控制樹,它以分層的形式列舉了頁面上所有的控制項:
Session 和Application 中的最後聲明了跟隨了所有伺服器變數的summaries,cookies 和headers 集合。
Trace 物件允許你為trace 輸出添加自訂資訊。它有兩個方法來完成: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 = ... .................... }}
運行來觀察影響:
為了偵測Warn 方法,讓我們在被選取的index changed 事件句柄中強制輸入一些錯誤的程式碼:
try{ int a = 0; int b = 9 / a;}catch (Exception e){ Trace.Warn("UserAction", "processing 9/a", e);}
Try-Catch 是一個C# 程式結構。 try 區塊持有任何可以或不可以產生錯誤的程式碼,catch 區塊捕捉了錯誤。當程式運行時,它在trace 日誌中發送警告。
應用程式層次的追蹤應用到網站中的所有的頁面。它透過將以下程式碼放入web.config 檔案來實現:
<system.web> <trace enabled="true" /></system.web>
儘管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>
部分有可能的屬性: - **Mode:**它允許或不允許自訂錯誤頁面。它有三個可能的值: - **On:**展示自訂頁面。 - **Off:**展示ASP.NET 錯誤頁面(黃色頁面) - **remoteOnly:**它展示了自訂錯誤到客戶端,展示本地的ASP.NET 錯誤。 - **defaultRedirect:**它含有頁面的URL 來顯示以備不能解決的錯誤。 為了給不同錯誤類型放置不同的自訂錯誤頁面,子標籤被使用,那裡不同的錯誤頁面基於錯誤的status 程式碼被指定。 為了實現頁面層級的錯誤解決,Page 指令能被修改為: `````` 因為ASP.NET Debugging 是它內部一個重要的主題,因此我們將在下一章單獨地討論它。