|
一、沒有異常處理代碼的程序
//創(chuàng)建數(shù)據(jù)連接對象,連接Northwind數(shù)據(jù)庫 SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Server=PC-2010;user id=sy2010;password=123456;Database=Northwind;"; //創(chuàng)建命令對象 SqlCommand cmd = new SqlCommand(); //設置命令對象的文本,表Customer本來是Customers,故意將s去掉的,以產(chǎn)生異常 cmd.CommandText = "Select * from Customer"; //設置命令對象的連接對象屬性 cmd.Connection = conn; //創(chuàng)建數(shù)據(jù)適配器對象 SqlDataAdapter sda = new SqlDataAdapter(); //設置數(shù)據(jù)適配器對象的SelectCommand屬性 sda.SelectCommand = cmd; //創(chuàng)建DataSet對象 DataSet ds = new DataSet(); //使用數(shù)據(jù)適配器對象填充數(shù)據(jù)集對象 sda.Fill(ds); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); 其執(zhí)行結(jié)果如下圖:
![]() 二、有異常處理代碼的程序
//創(chuàng)建數(shù)據(jù)連接對象,連接Northwind數(shù)據(jù)庫 SqlConnection conn = new SqlConnection(); try { conn.ConnectionString = "Server=PC-2010;user id=sy2010;password=123456;Database=Northwind;"; //創(chuàng)建命令對象 SqlCommand cmd = new SqlCommand(); //設置命令對象的文本,表Customer本來是Customers,故意將s去掉的,以產(chǎn)生異常 cmd.CommandText = "Select * from Customer"; //設置命令對象的連接對象屬性 cmd.Connection = conn; //創(chuàng)建數(shù)據(jù)適配器對象 SqlDataAdapter sda = new SqlDataAdapter(); //設置數(shù)據(jù)適配器對象的SelectCommand屬性 sda.SelectCommand = cmd; //創(chuàng)建DataSet對象 DataSet ds = new DataSet(); //使用數(shù)據(jù)適配器對象填充數(shù)據(jù)集對象 sda.Fill(ds); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); } catch (SqlException ex) { //使用異常捕獲的好處:第一、向管理員報告異常,第二、為用戶提供一個友好的提示:系統(tǒng)正在維護中 Response.Write("SqlException" + ex.Message); } catch (Exception ex) { Response.Write("Exception" + ex.Message); } //釋放資源
finally {
if (conn != null) conn.Dispose(); Response.Write("finally代碼執(zhí)行部分:完成"); } 其執(zhí)行結(jié)果如下圖:
![]() 三、獲得“Sql錯誤信息”的程序代碼 //創(chuàng)建數(shù)據(jù)連接對象,連接Northwind數(shù)據(jù)庫 SqlConnection conn = new SqlConnection(); try { //user id本來為sy2010,現(xiàn)故意將其改為sy20101,以出現(xiàn)異常 conn.ConnectionString = "Server=PC-2010;user id=sy20101;password=123456;Database=Northwind;"; //創(chuàng)建命令對象 SqlCommand cmd = new SqlCommand(); //設置命令對象的文本 cmd.CommandText = "Select * from Customers"; //設置命令對象的連接對象屬性 cmd.Connection = conn; //創(chuàng)建數(shù)據(jù)適配器對象 SqlDataAdapter sda = new SqlDataAdapter(); //設置數(shù)據(jù)適配器對象的SelectCommand屬性 sda.SelectCommand = cmd; //創(chuàng)建DataSet對象 DataSet ds = new DataSet(); //使用數(shù)據(jù)適配器對象填充數(shù)據(jù)集對象 sda.Fill(ds); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); } catch (SqlException ex) { Response.Write("異常信息:" + ex.Message + "<br>"); foreach (SqlError error in ex.Errors) { Response.Write( "Source: " + error.Source + "<br>" + "Number: " + error.Number.ToString() + "<br>" + "State: " + error.State.ToString() + "<br>" + "Class: " + error.Class.ToString() + "<br>" + "Server: " + error.Server + "<br>" + "Message: " + error.Message + "<br>" + "Procedure: " + error.Procedure + "<br>" + "LineNumber: " + error.LineNumber.ToString()); /* error對象各屬性的含義: (1)Source,獲取生成錯誤的提供程序的名稱 (2)Number,獲取一個標識錯誤類型的數(shù)字 (3)State,狀態(tài)編號其取值范圍為1至127,狀態(tài)編號指示發(fā)現(xiàn)錯誤的源位置 (4)Class,獲取從SQL Server返回的錯誤的嚴重程度(級別) (5)Server,獲取生成錯誤的SQL Server實例的名稱 (6)Message,獲取對錯誤進行描述的文本 (7)Procedure,獲取生成錯誤的存儲過程或遠程調(diào)用(RPC)的名稱 (8)LineNumber,從包含錯誤的Transact-SQL批命令或存儲過程中獲取行號 */ } } finally { if (conn != null) conn.Dispose(); Response.Write("<br>finally代碼執(zhí)行部分:完成"); } 其執(zhí)行結(jié)果如下圖:
![]() 注: 一、異常概念 1.程序中錯誤的類型 (1)語法錯誤 (2)邏輯錯誤 (3)運行時異常,比如數(shù)據(jù)庫連接不存在、被0除 2.DOTNET異常處理機制 程序發(fā)生異常后,將尋找異常處理代碼,如果不存在異常處理代碼,.NET Framework將處理該異常(演示異常發(fā)生狀況),.NET Framework處理異 常的方式就是將異常信息報告給用戶
二、異常處理方式
1.try(捕捉異常/拋出異常) 2.catch(抓住異常/處理異常) (1)抓異常的過程是一個匹配異常類的過程,如果匹配就執(zhí)行相應的異常處理代碼 (2)Exception是所有異常處理類的基類,將匹配所有的異常類 3.finally(執(zhí)行資源清理) (1)不過是否發(fā)生異常都將執(zhí)行異常處理 (2)finally不是必須的,在編程時可以根據(jù)需要進行應用 三、Exception類
1.System.Exception類表示在應用程序執(zhí)行期間發(fā)生的錯誤 2.System.Exception 類是所有異常的基類型 Message 屬性是 string 類型的只讀屬性,它包含對發(fā)生異常的原因的可讀描述 四、自定義異常處理類
1.如果在程序執(zhí)行過程中所引發(fā)的異常在C#中沒有定義,這是我們可以自定義異常處理類以向用戶提示異常信息。 2.所有用戶自定義的異常處理類都直接或者間接從Exception類派生而來 class MyException:Exception { public MyException(string strMessage):base(strMessage) { } } 五、數(shù)據(jù)訪問異常處理類
1.在ADO.NET中,每一個數(shù)據(jù)提供程序都提供三種類型的類,這三種類型的類分別為Exception, Error, 和 ErrorCollection 2.SQL Server數(shù)據(jù)提供程序提供了SqlException, SqlError和SqlErrorCollection 六、使用SqlException類
1.SqlException對象表示當 SQL Server 返回警告或錯誤時引發(fā)的異常 2.SqlException類的基類為System.Exception 3.每當 SQL Server .NET Framework 數(shù)據(jù)提供程序遇到服務器生成的錯誤時,都將創(chuàng)建此類 七、使用 SqlError類和SqlErrorCollection類
1.SqlException.Errors屬性返回SqlErrorCollection類的一個對象 2.SqlErrorCollection對象是SqlError對象的集合 3.每一個SqlError對象封裝了由SQL Server服務器引發(fā)的錯誤或者警告 八、識別SQL Server 2000 錯誤
1.如果向SQL Server發(fā)送一個錯誤的SQL命令,SQL Server將返回一個格式化的錯誤消息 Server: Msg 208, Level 16, State 1, Line 1 Invalid object name 'SomeTable' 2.消息格式 Server: Msg 208, Level 16, State 1, Line 1 Invalid object name 'SomeTable' (1)第一部分為錯誤消息編號,在SQL Server中每一個錯誤消息都有一個相應的編號與之對應。消息編號唯一標識每一個錯誤消息。 (2)消息的第二部分為錯誤的安全級別,其值在0到25之間,錯誤安全級別代表錯誤的種類 (3)錯誤消息的第三部分為狀態(tài)編號,其取值范圍為1至127,狀態(tài)編號指示發(fā)現(xiàn)錯誤的源位置 (4)錯誤消息的最后一部分為錯誤的描述,SQL Server的錯誤消息都存儲在系統(tǒng)表sysmessages中,可以通過查詢語句“select * from sysmessages”查詢出這些錯誤消息
3.錯誤安全級別 范圍 說明 0–10 表示該消息并不是錯誤消息,而僅僅是提供一些有用的信息 11–16 11-16類別的錯誤是由用戶導致的。例如安全級別16表示用戶執(zhí)行了一個錯誤的更新操作 17 SQL Server已經(jīng)使用了不可配置的資源,例如鎖 18 代表非重大的內(nèi)部軟件錯誤 19 已經(jīng)超過了不可配置的資源限制 20 當前進程殘生的錯誤 21 影響SQL Server所有進程的錯誤 22 表或者索引被破外 23 表示一個非法的數(shù)據(jù)庫 24 表示硬件錯誤 25 代表系統(tǒng)錯誤 九、SQL SERVER錯誤日志
1.SQL Server維護一個錯誤日志(文本格式)用于存儲服務器信息和錯誤消息 2.錯誤日志文件可以幫助我們記錄下來各種出現(xiàn)的問題和潛在的問題 3.SQL Server日志文件存儲在SQL Server根目錄下的LOG文件夾下,在這個文件夾下有不止一個日志文件,并且第一個文件為ERRORLOG 4.可以使用記事本打開日志文件 |
|
|
來自: 寒木蕭條 > 《aspDotNetCode》