ASP.NET中的錯誤處理有三個方面:
跟蹤-在頁面級或應用程式級跟蹤程序執行。
錯誤處理-在頁面級別或應用程式級別處理標準錯誤或自定義錯誤。
調試-單步執行程序,設置斷點以分析代碼
在本章中,我們將討論跟蹤和錯誤處理,在本章中,我們將討論調試。
要理解這些概念,請創建以下示例應用程式。它有一個標籤控制項、一個下拉列表和一個連結。下拉列表加載著名引號的數組列表,選定的引號顯示在下面的標籤中。它還有一個指向不存在連結的超連結。
<%@ 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
要啓用頁級跟蹤,需要修改page指令並添加跟蹤屬性,如圖所示:
<%@ 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
從伺服器發送的狀態代碼,每次請求頁面時都會顯示錯誤的名稱和時間(如果有)。下表顯示了常見的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 | HTTP version not supported |
在頂層信息下,有跟蹤日誌,它提供頁面生命周期的詳細信息。它提供自頁面初始化以來所用的時間(秒)。
下一部分是控制項樹,它以分層方式列出頁面上的所有控制項:
最後是會話和應用程式狀態摘要、cookies和headers集合,後面是所有伺服器變量的列表。
Trace對象允許您向跟蹤輸出添加自定義信息。它有兩種實現方法:Write方法和Warn方法。
更改頁面加載事件處理程序以檢查寫入方法:
protected void Page_Load(object sender, EventArgs e) { Trace.Write("Page Load"); if (!IsPostBack) { Trace.Write("Not Post Back, Page Load"); string[,] quotes = ....................... } }
跑步觀察效果:
要檢查Warn方法,讓我們在選定的索引更改事件處理程序中強制輸入一些錯誤代碼:
try { int a = 0; int b = 9 / a; }catch (Exception e) { Trace.Warn("UserAction", "processing 9/a", e); }
Try Catch是一個C#編程構造。try塊保存任何可能會或可能不會產生錯誤的代碼,catch塊捕獲錯誤。當程序運行時,它會在跟蹤日誌中發送警告。
應用程式級跟蹤應用於網站中的所有頁面。它是通過在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>部分具有可能的屬性:
模式:啓用或禁用自定義錯誤頁。它有三個可能的值:
- On : displays the custom pages.
- Off : displays ASP.NET error pages (yellow pages)
- remoteOnly : It displays custom errors to client, display ASP.NET errors locally.
defaultRedirect:它包含在出現未處理的錯誤時要顯示的頁面的URL。
要爲不同類型的錯誤放置不同的自定義錯誤頁,將使用子標記,其中根據錯誤的狀態代碼指定不同的錯誤頁。
要實現頁級錯誤處理,可以修改頁指令:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>
因爲ASP.NET調試本身就是一個重要的主題,所以我們將在下一章中分別討論它。