鍍金池/ 教程/ C#/ 異常處理
調(diào)試
管理狀態(tài)
Panel 控件
Web 服務(wù)
語言集成查詢
數(shù)據(jù)源
基礎(chǔ)控件
廣告輪轉(zhuǎn)器
服務(wù)器端
服務(wù)器控件
ADO.NET
多線程
HTML 服務(wù)器
生命周期
Ajax 控制
客戶端
異常處理
環(huán)境設(shè)置
部署
個(gè)性化
驗(yàn)證器
多視圖
日歷
文件上傳
ASP.NET - 數(shù)據(jù)綁定
數(shù)據(jù)庫存取
實(shí)例
自定義控件
簡(jiǎn)介
配置
數(shù)據(jù)緩存
安全性
指令
事件處理

異常處理

在 ASP.NET 中異常處理有三個(gè)方面:

  • Tracing - 在頁面級(jí)或者應(yīng)用程序級(jí)追蹤程序執(zhí)行。
  • Error handling - 在頁面級(jí)或者應(yīng)用程序級(jí)解決標(biāo)準(zhǔn)錯(cuò)誤或者自定義錯(cuò)誤。
  • Debugging - 在程序中前進(jìn),設(shè)置斷點(diǎn)來分析代碼。

在這一章中,我們將討論 tracing 和 handling。并且在這一章中,我們將涉及 debugging。

為了理解概念,創(chuàng)建以下的樣本應(yīng)用程序。它有一個(gè) label 控件,一個(gè) dropdown 列表和一個(gè)鏈接。dropdown 列表加載了一個(gè)名言的 array 列表并且被選擇的引用將顯示在下面的標(biāo)簽中。它也擁有一個(gè)超鏈接,它指向一個(gè)不存在的鏈接。

<%@ 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

為了允許頁面級(jí)別的追蹤,你需要修改 Page 指令并且如下添加一個(gè) Trace 屬性:

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

現(xiàn)在當(dāng)你執(zhí)行文件時(shí),你將得到追蹤信息:

http://wiki.jikexueyuan.com/project/asp-net/images/tracing_info.jpg" alt="1" />

它在首部提供了以下的信息:

  • Session ID
  • Status Code
  • Time of Request
  • Type of Request
  • Request and Response Encoding

每次頁面被需要時(shí),從服務(wù)器發(fā)出的 status 代碼顯示名字和錯(cuò)誤時(shí)間,如果有的話。以下的表格顯示普通的 HTTP status 代碼:

數(shù)字 描述
通知(100 - 199)
100 繼續(xù)
101 轉(zhuǎn)換協(xié)議
成功(200 - 299)
200 OK
204 無內(nèi)容
重定向(300 - 399)
301 永久移動(dòng)
305 使用代理
307 暫時(shí)重定向
來自客戶端的錯(cuò)誤(400 - 499)
400 錯(cuò)誤請(qǐng)求
402 支付需求
404 未找到
408 請(qǐng)求超時(shí)
417 期望失敗
來自服務(wù)器的錯(cuò)誤(500 - 599)
500 內(nèi)部服務(wù)器錯(cuò)誤
503 服務(wù)不可用
505 HTTP 版本不支持

在頂級(jí)信息下,有一個(gè) Trace 日志,它提供了頁面生命周期的細(xì)節(jié)。它提供了頁面被初始化后的以秒為單位的運(yùn)行時(shí)間。

http://wiki.jikexueyuan.com/project/asp-net/images/tracing_info2.jpg" alt="2" />

下一個(gè)部分是控件樹,它以分層的形式列舉了頁面上所有的控件:

http://wiki.jikexueyuan.com/project/asp-net/images/tracing_info3.jpg" alt="3" />

Session 和 Application 中的最后聲明了跟隨了所有服務(wù)器變量的 summaries,cookies 和 headers 集合。

Trace 對(duì)象允許你給 trace 輸出添加自定義信息。它有兩個(gè)方法來完成:Write 方法和 Warn 方法。

改變 Page_Load 事件句柄在檢測(cè) Write 方法:

protected void Page_Load(object sender, EventArgs e)
{
   Trace.Write("Page Load");

   if (!IsPostBack)
   {
      Trace.Write("Not Post Back, Page Load");
      string[,] quotes = 
      .......................
   }
}

運(yùn)行來觀察影響:

http://wiki.jikexueyuan.com/project/asp-net/images/tracing_info4.jpg" alt="4" />

為了檢測(cè) Warn 方法,讓我們?cè)诒贿x擇的 index changed 事件句柄中強(qiáng)制輸入一些錯(cuò)誤的代碼:

try
{
   int a = 0;
   int b = 9 / a;
}catch (Exception e)
{
   Trace.Warn("UserAction", "processing 9/a", e);
}

Try-Catch 是一個(gè) C# 編程結(jié)構(gòu)。try 塊持有任何可以或不可以產(chǎn)生錯(cuò)誤的代碼,catch 塊捕獲了錯(cuò)誤。當(dāng)程序運(yùn)行時(shí),它在 trace 日志中發(fā)送警告。

http://wiki.jikexueyuan.com/project/asp-net/images/tracing_info5.jpg" alt="5" />

應(yīng)用程序?qū)哟蔚淖粉檻?yīng)用到網(wǎng)站中的所有的頁面。它通過將以下代碼放入 web.config 文件被實(shí)現(xiàn):

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

錯(cuò)誤解決

盡管 ASP.NET 能檢測(cè)所有的運(yùn)行時(shí)錯(cuò)誤,仍然有一些微小的錯(cuò)誤仍在那兒。通過追蹤觀察錯(cuò)誤是為開發(fā)者準(zhǔn)備的,而不是用戶。

因此,為了攔截這樣情況的發(fā)生,你可以在應(yīng)用程序的 web.config 中添加錯(cuò)誤解決設(shè)置。它是應(yīng)用程序范圍的錯(cuò)誤解決。例如,你可以在 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:**它允許或者不允許自定義錯(cuò)誤頁面。它有三個(gè)可能的值: - **On:**展示自定義頁面。 - **Off:**展示 ASP.NET 錯(cuò)誤頁面(黃色頁面) - **remoteOnly:**它展示了自定義錯(cuò)誤到客戶端,展示本地的 ASP.NET 錯(cuò)誤。 - **defaultRedirect:**它含有頁面的 URL 來展示以備不能解決的錯(cuò)誤。 為了給不同錯(cuò)誤類型放置不同的自定義錯(cuò)誤頁面,子標(biāo)簽被使用,那里不同的錯(cuò)誤頁面基于錯(cuò)誤的 status 代碼被指定。 為了實(shí)現(xiàn)頁面級(jí)別的錯(cuò)誤解決,Page 指令能被修改為: ``` ``` 因?yàn)?ASP.NET Debugging 是它內(nèi)部一個(gè)重要的主題,因此我們將在下一章單獨(dú)地討論它。
上一篇:配置下一篇:基礎(chǔ)控件