1. 程式人生 > >C#高級編程八十一天----捕獲異常

C#高級編程八十一天----捕獲異常

意思 esp rgs track com nbsp 原因 修飾 tracking

捕獲異常

前面主要說了關於異常的一些基礎和理論知識,沒有進入到正真的異常案例,這一講通過幾個案例來描寫敘述一下異常的捕獲和處理.

案例代碼:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 異常處理

{

class Program

{

int result;

Program()

{

result = 0;

}

public void DisPlay(int a, int b)

{

try//這個話可能有問題

{

result = a / b;

}

catch (DivideByZeroException e) //不知道這個異常代表什麽自己去查,有過那句話真的有問題,我就得治它

{

Console.WriteLine("Exception caught: {0}", e);

}

finally//無論怎樣,以下這句話我必須得輸出

{

Console.WriteLine("Result: {0}", result);

}

}

static void Main(string[] args)

{

Program p = new Program();

p.DisPlay(25, 0);

Console.ReadKey();

}

}

}

別和我說你看不懂,唯一看不懂得地方就是哪一點try-catch語句的地方,我都凝視好了(你試試沒有try-catch語句會咋樣?===>假設沒有try,程序會終止)

簡單說點其它小內容:

try ... catch 的目的是解決程序在出現錯誤時無法繼續運行下去的問題。

try不一定僅僅能和catch 配對,也能夠try{}finally{}這種形式,這不是沒有意義,由於這樣能夠保證即使發生了異常,finally裏面的代碼一定會被運行。有時候,這個還是很實用的。

比方能夠用來釋放一些自己占用的資源。然後讓調用者處理異常。

對異常的捕獲由三個部分組成:

try { //運行的代碼,當中可能有異常。

一旦發現異常。則馬上跳到catch運行。否則不會運行catch裏面的內容 } catch { //除非try裏面運行代碼發生了異常,否則這裏的代碼不會運行 } finally { //無論什麽情況都會運行,包含try catch 裏面用了return ,能夠理解為僅僅要運行了try或者catch,就一定會運行 finally }

Try語句

Catch語句

Finally語句

try -- 意思是 “試一試”
catch -- 意思是 “抓”,抓一抓。
沒有錯,就抓不到錯。有錯才幹抓到並處理。

一個try能夠跟隨意個catch(個數沒有限制)。主要是看有多少個異常類型。包括自己定義的,Eeception是個類, 申明一個exEeception對象,這個ex裏面包括了當前發生在捕捉到的try塊的全部異常信息,ex.Message最經常使用的 (try塊的具體異常信息),

ex的位置:僅僅能在cath塊 (異常處理塊)
ex的作用:保存著系統捕獲的異常;
為什麽要用ex: 由於你不是神。並不能預測到你的程序會出什麽錯。所以就用
MessageBox.Show(ex.Message);讓系統提示你程序錯在哪裏,就能夠順藤摸瓜,逮到錯誤源從而解決他!

假設catch語句捕獲了try語句不可能拋出的異常時,代碼將不能通過,假設catch語句中使用例如以下方式:catch( Exception e ){ }將在不論什麽情況下。編譯都能通過。

?try{ DataConnection.Open(); DataCommand.ExecuteReader(); ... return;}finally{ DataConnection.Close();}


不管是否拋出異常,也不管在catch 中從什麽地方return返回,finally語句塊總是會運行,這樣你有機會調用Close來關閉數據庫連接(即使未打開或打開失敗。關閉操作永遠是能夠運行的),以便於釋放已經產生的連接,釋放資源。
另外說明。return是能夠放在try語句塊中的。但無論在什麽時機返回,在返回前,finally將會運行。

throw(不止throws)的作用是當代碼運行到此處時覺得的讓程序出錯。出錯原因是你指定的內容
catch的作用是try包括的內容執行出錯時,catch撲捉到try裏面出錯的原因,至於對於這個錯誤你怎麽操作就放在catch裏,你能夠把錯誤寫日誌,messagebox輸出等等

備註:throw是語句,拋出一個異常 ; throws是方法拋出一個異常;

throw語法: throw <異常對象>

(C#中是沒有throws,JAVA裏有!別搞錯了)throws語法 : [修飾符] <返回值類型> <方法名>([參數列表]) [throws <異常類>]

當中:異常類能夠聲明多個,用逗號分隔.

上面的那個案例,你試試經catch語句裏的內容換成下面內容?

throw e;(應該會程序終止)

也能夠換成這樣:

throw new Exception("出錯啦。", e);//這個時候也會終止程序,你註意看終止信息!!!

註意在捕獲並拋出異常時應使用 throw new Exception("出錯啦!", ex); 方式,則可獲得異常的詳細位置。

當在VS調試或者DEBUG模式下執行程序成都可獲得異常發生的詳細位置。

但當在獨立執行的RELEASE模式下時,異常僅僅會記錄最初的調用位置。

當運行文件夾不包括 *.pdb 文件時,異常信息中不會包括代碼及行號信息。

最後以一個案例結束異常捕獲的部分:

class Program

{

static void Main(string[] args)

{

string userInput;

while (true)

{

try

{

Console.WriteLine("請輸入05之間的隨意一個數字: ");

userInput = Console.ReadLine();

if (userInput == "")

{

//當用戶輸入"",跳出trywhile可是仍然運行finally

break;

}

int index = Convert.ToInt32(userInput);

if (index < 0 || index > 5)

{

//拋出異常

//可使用System.Exception,可是該類是個基本類,,沒有包括特定錯誤信息

//此處可用派生類IndexOutRangeException

throw new IndexOutOfRangeException("請你看看要求好不好,你輸入的是: " + userInput);

}

Console.WriteLine("你輸入了:" + index);

}

//傳遞給catch塊的參數僅僅能用於該catch,因此興許catch塊仍然可用同名參數ex

catch (IndexOutOfRangeException ex)

{

Console.WriteLine("異常了: " + ex.Message);

}

/*

* 假設沒有前面catch塊中捕獲的異常類,這個也能處理IndexOutOfRangeException

* 計算機僅僅運行它在catchh塊列表中找到的第一個合適的catch

* 基類的一個引用可一直想派生於他的全部類實例

* 因此,最上面的catch塊應用於最特殊的異常情況,最後的是一般的catch

*

*/

catch (Exception ex)

{

Console.WriteLine("拋出異常: " + ex.Message);

}

/*

* 最一般的catch(不帶參數),用於處理其它沒用C#編寫的代碼拋出的異常

* C#中僅僅有派生於System.Exception類的實例才幹作為一場拋出,其它語言沒這個限制

* catch塊相同捕獲所有異常,僅僅是不知異常的具體信息

*/

catch

{

//由於我們不知道這個異常表示什麽類

Console.WriteLine("不知道什麽異常,你自己猜去把.");

}

//不管運行try,catch最後都運行finally

finally

{

Console.WriteLine("無論咋樣,我都得運行,哥就是牛X");

}

/* 沒有處理異常時發生的情況

* 生成一個異常後,代碼中沒有catch塊能處理這異常。由.NET執行庫捕獲

* .NET執行庫把整個程序放在還有一個更大的try塊中,用一個catch處理捕獲全部異常

*/

}

}

}

註意:一般編寫一個可運行程序,硬不貨異常,編寫一個庫,最好不要補貨,要家丁調用代碼能夠處理.

C#高級編程八十一天----捕獲異常