|
ASP.NET中的異常處理
上面已經(jīng)排除了服務(wù)器中存在的一些故障,接下來要處理的就是程序當(dāng)中存在的一些錯(cuò)誤。通常把代碼中存在的錯(cuò)誤叫異常。本節(jié)主要介紹如何處理ASP.NET程序中的異常。
調(diào)試異常是開發(fā)功能完善的ASP.NET應(yīng)用程序的重要一步。若要調(diào)試未處理的ASP.NET異常,則需確保調(diào)試器能夠在發(fā)生這些異常時(shí)停止。ASP.NET運(yùn)行庫具有一個(gè)頂級(jí)異常處理程序,因此默認(rèn)情況下,調(diào)試器從不在發(fā)生未處理的異常時(shí)中斷。若要通知調(diào)試器在發(fā)生異常時(shí)中斷,必須轉(zhuǎn)到"異常"對(duì)話框,然后在該對(duì)話框內(nèi)選中發(fā)生異常名稱后的復(fù)選框,如圖14.11所示。
如果已啟用"僅我的代碼",則在系統(tǒng)代碼(如NET Framework方法)中發(fā)生異常時(shí),"發(fā)生以下異常時(shí)中斷:引發(fā)"選項(xiàng)不會(huì)導(dǎo)致調(diào)試器立即中斷。執(zhí)行將繼續(xù),直至調(diào)試器命中用戶的代碼,然后調(diào)試器中斷。這意味著不必在發(fā)生異常后逐句通過系統(tǒng)代碼。
|
| 圖14.11 "異常"對(duì)話框 |
"僅我的代碼"向用戶提供了另一個(gè)可能更有用的選項(xiàng):"發(fā)生以下異常時(shí)中斷:用戶未處理的"。如果為異常選擇此設(shè)置,則調(diào)試器會(huì)將用戶代碼中斷執(zhí)行,但是僅當(dāng)異常沒有被用戶代碼捕獲和處理時(shí)才這樣做。此設(shè)置實(shí)質(zhì)上使頂級(jí)ASP.NET異常處理程序不起作用,因?yàn)樵撎幚沓绦蛟诜怯脩舸a中。
啟用ASP.NET異常調(diào)試和"僅我的代碼"
如果要使用"用戶未處理的"設(shè)置,則必須啟用"僅我的代碼",方法如下:
(1)從"調(diào)試"菜單中選擇"異常"命令,打開"異常"對(duì)話框。
(2)在"公共語言運(yùn)行庫異常"行上選擇"引發(fā)"或"用戶未處理的"命令,如圖14.12所示。
|
圖14.12 設(shè)置"用戶未處理"的異常 |
ASP.NET異常處理的最佳方法
在可能引發(fā)異常的代碼周圍使用try…catch…finally塊。例如,如果應(yīng)用程序調(diào)用XML Web Services或直接調(diào)用SQL Server,則應(yīng)該將該代碼置于try…catch塊中,因?yàn)榇诉^程中可能會(huì)發(fā)生大量異常。
catch和finally一起使用的常見方式是:在try塊中獲取并使用資源,在catch塊中處理異常情況,并在finally塊中釋放資源。
下面的代碼演示捕捉異常,并作出相應(yīng)處理。
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using System.Data.SqlClient;
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- DataSet ds= new DataSet(); ;
- try
- {
- //讀取XMLFile文件中的數(shù)據(jù),并將數(shù)據(jù)信息綁定到表格控件中
- ds.ReadXml(Server.MapPath("~/XMLFile.xml"));
- this.GridView1.DataSource = ds.Tables["XML"].DefaultView;
- this.GridView1.DataBind();
- }
- catch( Exception ex)
- {
- //拋出異常
- Response.Write(ex);
- }
- finally
- {
- //釋放資源
- ds.Dispose();
- }
- }
- }
- }
輸出結(jié)果如下: - System.NullReferenceException: 未將對(duì)象引用
設(shè)置到對(duì)象的實(shí)例。 在 _Default.Page_Load(Object sender, EventArgs e) 位置 e:\Asp.net從基礎(chǔ)入門到 項(xiàng)目實(shí)戰(zhàn)\Instances\14\01\Default.aspx.cs:行號(hào) 22
|