關于異常的處理想必大家都了解try{}catch(){}finally{},這里就不再講了。通過在VS里的"調試"-"異常",在彈出的異常對話框里的Common Language Runtime Exceptions欄里是.NET中的異常層次結構。
自定義異常:
如果系統提供的異常類已經不能夠滿足應用系統開發的需要,或者開發團隊需要一套自定義異常處理機制,可以創建自定義的異常類。自定義異常類應該直接過間接地繼承自applicationException類,并且其最好有良好的命名:錯誤的描述性名稱+Exception,應該定義3個構造函數:默認構造函數,接受錯誤消息的構造函數,接受錯誤消息和內部異常對象的構造函數。CLR拋出的異常都繼承自SystemException,應用程序拋出的異常應當繼承自ApplicationException。這樣一來,開發人員就能夠編寫catch塊來捕獲所有CLR拋出的異常或所有應用程序拋出的異常。
anderslly推薦 shineqiujuan
記錄異常:
Web應用程序的用戶可能成千上萬,有時除了向用戶顯示錯誤信息外可能還需要將異常記錄下來,比如web服務器負載過重,一些問題間歇性地多次出現等。.NET框架提供了多種記日志工具,比如可以在錯誤產生時發送E-mail,添加到數據庫記錄或讀寫文件中。一個較好的處理方式是使用windows事件,windows事件程序是windows系統內置的用于記錄系統或應用程序日志的一個工具,可以被任何應用程序使用。
在控制面板里的管理工具里打開事件查看器來查看windows事件日志。一般事件分類有應用程序(用于記錄任何應用程序的錯誤或通知,通??梢栽谶@里記錄ASP.NET應用程序異常)系統(用于記錄跟操作系統相關的事件)安全(用于記錄安全相關的問題,僅由操作系統使用)。在這些事件分類里單擊某個事件將彈出該事件的詳細信息窗口。右擊這些事件分類后可以清除日志,另存日志,新建日志查看,從文件打開,通過屬性可以設置日志文件的大小上限等。如果日志大小超過指定上限,則自動清除過期的事件日志。
將異常寫入windows事件日志
System.Diagnostics命名空間下的EventLog類可以讀寫事件日志
PRotected void Button1_Click(object sender, EventArgs e)
{
try
{
int a = 1; int b = 0;
int c = a / b;
}
catch (Exception ex)
{
Label1.Text = "<b>錯誤消息:</b>"+ ex.Message + "<br/>"; 錯誤的描述信息
Label1.Text += "<b>錯誤源:</b>" + ex.Source + "<br/>"; 返回哪個程序集出錯了
Label1.Text += "<b>堆棧追蹤:</b>" + ex.StackTrace;
Label1.ForeColor = System.Drawing.Color.Red;
判斷windows事件日志里有沒有該類事件,我們可以在事件日志看到每個事件都有一個事件ID,事件ID相同的事件就屬于同一類事件
if (!EventLog.SourceExists("除法運算錯誤"))
{
如果不存在該類事件就注冊該類事件,并且將該類事件注冊在我們自定義的事件分類里,第二個參數默認為應用程序
EventLog.CreateEventSource("除法運算錯誤", "ASPNET事件日志");
}
EventLog類的構造函數可以打開指定的事件分類(相當于某個表)
EventLog elog = new EventLog("ASPNET事件日志");
指定事件來源字符串,該字符串將出現在事件分類的來源欄(相當于來源字段)里
elog.Source = "來自web服務器";
將一個事件項寫入指定事件分類里,這里指定了事件描述,事件類型,還可以指定事件ID等(相當于一條記錄)
elog.WriteEntry(ex.Message, EventLogEntryType.Error);
}
}
可以看出windows事件日志就像一個數據庫,事件分類就是不同的表,里面的事件項就是記錄
編程查看事件日志(相當于查看數據庫中某個表的所有記錄)
復雜的,指定了顯示的字段
首先創建一個事件項實體類
public class EventItem
{
public string EventType{get;set;} 事件類型
public string EventMessage{get;set;} 事件描述
public DateTime EventTime{get;set;} 事件發生時間
public string EventSource{get;set;} 事件來源
public EventItem(string eventtype,string eventmessage,DateTime eventtime,string eventsource)
{
EventType = eventtype;
EventMessage = eventmessage;
EventTime = eventtime;
EventSource = eventsource;
}
}
然后創建一個列表類用于保存某個事件分類里的所有事件項
public class EventList : List<EventItem>
{
public EventList(string logname)
{
if (!EventLog.Exists(logname))判斷是否有該事件分類(是否有該表)
{
return;
}
else
{
EventLog elog = new EventLog(logname); 打開某事件分類
foreach (EventLogEntryitem in elog.Entries) 事件項是EventLogEntry類型,Entries屬性可獲取該事件分類里的所有事件項
{
EventItem eventitem = new EventItem(item.EntryType.ToString(), item.Message, item.TimeGenerated, item.Source);
this.Add(eventitem);
}
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string logname = TextBox1.Text;
EventList eventlist = new EventList(logname);
GridView1.DataSource = eventlist;
}
簡單的,獲取的事件項包含默認字段
protected void Button1_Click(object sender, EventArgs e)
{
string logname = TextBox1.Text;
EventLog elog = new EventLog(logname);
GridView1.DataSource = elog.Entries; Entries屬性返回集合類型是EntryCollection,其繼承了IEnumerable,可以綁定
GridView1.DataBind();
}
利用log4net來記錄日志
http://blog.csdn.net/zhoufoxcn/archive/2010/11/23/6029021.aspx|推薦
http://m.survivalescaperooms.com/dragon/archive/2005/03/24/124254.aspx|推薦
http://m.survivalescaperooms.com/xugang/archive/2008/04/09/1145384.html
http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx
http://blog.csdn.net/antyi/archive/2007/04/30/1592812.aspx
下面配置的是每天都產生一個txt日志文件的方式,其他方式在第一個鏈接里都有描述,第二個鏈接理論講的很好
<log4net>
<root>
<appender-ref ref="RollingLogFileAppender_DateFormat" />
</root>
<appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">
<file value="Log/Dailylog.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="日期[%date]線程ID[%thread]文件名[%file]行號[%line]%-5當前優先級別[%level]錯誤描述[%message]" />
</layout>
</appender>
</log4net>
頁面追蹤
盡管ASP.NET的錯誤頁面提供了非常有用的信息,但是有時候開發人員需要更詳細的信息來修正應用程序中的錯誤。比如應用程序執行一個屬性或者是追蹤應用程序中的邏輯錯誤。有時候應用程序可能產生了一些無效的數據,但是并沒有明顯的異常觸發。ASP.NET提供了追蹤功能,讓開發人員使用一種更方便和有彈性的方式來報告診斷信息。
在頁面級別啟用除了可以在<%@ PageTrace="true"%>設置外,還可以在代碼中設置,如:
protected void Page_Load(object sender,EventArgs e)
{Page.Trace.IsEnabled=true;}
Page對象的Trace屬性是System.Web.TraceContext類的實例。使用代碼的好處在于可以根據特定的環境來啟用和禁止頁面追蹤功能。
這樣運行后ASP.NET追蹤提供了大量的診斷信息:
1.請求詳細信息(sessionID,請求類型,請求時間,請求的狀態碼,請求編碼,響應編碼)
2.跟蹤信息(追蹤信息顯示頁面被發送到客戶端之前頁面的處理流程,并提供了頁面執行的詳細執行時長)
3.控件樹(顯示頁面上所有runat=server的控件)
4.會話狀態和應用程序狀態(顯示當前應用程序中所有會話狀態Session的鍵,值,類型和所有應用程序狀態Application的鍵,值,類型)
5.請求Cookie集合(web瀏覽器請求的Cookies的名,值,大小) 響應Cookie集合(web服務器發送的Cookies的名,值,大小)
6.標頭集合(列出了所有HTTP頭信息(是作為請求的一部分發送到web服務器的一小塊信息,包括請求信息,支持的內容類型,使用的語言等))
7.響應標頭集合(列出了作為響應發送到客戶端的一部分信息)
8.窗體集合(post方式提交的表單信息) 但貌似8,9只是表單中服務器控件的值(ASP.NET頁面追蹤只追蹤服務器控件?)
9.Querystring集合(get方式提交的表單信息/查詢字符串中的名稱和值)
10.服務器變量(通常不必看)
以上只是針對一個頁面使用追蹤,可以在根web.config中設置,對整個應用程序啟動追蹤,在<system.web>下配置:
<system.web>
<trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/>
</system.web>
requestLimit(最大數量的HTTP請求的追蹤信息) traceMode(按什么方式排序) localOnly(追蹤信息只顯示在本地)
訪問這些請求信息時只需訪問根目錄下的trace.axd(實際不存在)就可以了。
對了,大家都在說程序人生的網站,我也推薦一下吧。
新聞熱點
疑難解答