
Exception.jpg
? 異常處理是指程序在運行過程中,發(fā)生錯誤會導致程序退出,這種錯誤,就叫做異常。
因此處理這種錯誤,就稱為異常處理。
異常處理機制
? 在C#中的異常處理機制是使用使用try, catch,finally代碼塊進行處理。
-
try塊
在try塊中包含會拋出異常的代碼;而且一個try快必須關聯catch或者finally。
-
catch塊
在catch中包含處理異常的代碼;一個try塊可以關聯多個catch塊,catch后面的參數為捕捉類型,而他的捕捉類型必須是System.Exception或者它的派生類,如果有多個catch塊,那么其中的捕捉類型必須是由子類由上至下的排列,一次捕捉;當然為了兼容其他CLR的語言(CLR允許拋出任何類型,不僅僅是Exception類及子類 ,比如Int32,DateTime,String),所以catch后面也可以不許用加捕捉類型
void Method(){ try{ .... } catch(XxxException){//捕捉XxxException異常 ... } catch(YyyException){//捕捉YyyException異常 ... } catch(Excetion){//捕捉Exception異常 ... } catch{//捕捉所有拋出的試列 ... } } -
finally塊
在finally塊中包含必須執(zhí)行的代碼。一般finally塊中執(zhí)行try塊中需要清理資源的操作,必須在打開了文件后,關閉文件就應放在finally塊中:
void Method(string pathName){ FileStream fs = null; try{ fs = new FileStream(pathName,FileMode.Open); ... } catch(IOException){ ... } finally{ //確保fs被清理 if(fs!=null) fs.Close(); } }以上的代碼就確保了是否try包含異常,文件都會被關閉。如果沒有finally,那么文件關閉操作只會在垃圾回收中執(zhí)行。
System.Exception類
? CLR允許拋出任何類型的實例。但是C#必須拋出System.Exception類及他的子類。
System.Exception類型常公共屬性
| 屬性名稱 | 訪問 | 類型 | 說明 |
|---|---|---|---|
| Message | 只讀 | String | 錯誤消息以處理異常的開發(fā)人員為目標。Message屬性的文本應該完整地描述錯誤,并且在可能的情況下,還應該解釋如何更正錯誤。頂級異常處理程序可以向最終用戶顯示消息,因此您應該確保它在語法上是正確的,并且消息的每個句子都以句點結束。不要使用問號或感嘆號。如果您的應用程序使用本地化的異常消息,則應確保準確轉換它們 |
| Data | 只讀 | IDictionary | 使用Data屬性返回的System.Collections.IDictionary對象來存儲和檢索與異常相關的補充信息。代碼在拋出異常前在該集合中添加記錄項;捕捉異常的代碼可在異常恢復過程中查詢記錄項并利用其中信息。 |
| Source | 讀/寫 | String | 包含生成異常的程序集名稱。 |
| StackTrace | 只讀 | String | 包含拋出異常前的堆棧信息。其中的信息是描述了異常發(fā)生前調用的哪些方法,這些信息用于檢查代碼,修復bug非常有效 |
| InnerException | 只讀 | Exception | 如果當前異常是在處理一個異常時拋出的,指出上一個異常是什么 |
| TargetSite | 只讀 | MethodBase | 包含拋出異常的方法。 |
一個異常拋出時,CLR會記錄throw指令的位置,然后在訪問StackTrace屬性時將堆棧信息寫入。
每次當throw ex時,會重置異常的起點。
void Method(){
try{
....
}
catch(Exception ex){
throw ex;//ex的StackTrace中的起點就更新為這里
}
}
public static void MethodDemo1()
{
string exstr1 = "", exstr2="", exstr3="";
try
{
try
{
try
{
throw new Exception("這是一個異常");
}
catch(Exception ex)
{
exstr1 = ex.StackTrace;
// at LearningDemo.ExceptionDemo.MethodDemo1() in C:\Users\wuxia\Desktop\桌面臨時文件\LearningDemo\LearningDemo\ExceptionDemo.cs:line 19
throw;
}
}
catch(Exception ex)
{
exstr2 = ex.StackTrace;
// at LearningDemo.ExceptionDemo.MethodDemo1() in C:\Users\wuxia\Desktop\桌面臨時文件\LearningDemo\LearningDemo\ExceptionDemo.cs:line 19
throw ex;
}
}
catch(Exception ex)
{
exstr3 = ex.StackTrace;
//at LearningDemo.ExceptionDemo.MethodDemo1() in C:\Users\wuxia\Desktop\桌面臨時文件\LearningDemo\LearningDemo\ExceptionDemo.cs:line 30
}
finally
{
Console.WriteLine(exstr1);
Console.WriteLine(exstr2);
Console.WriteLine(exstr3);
}
}
在以上例子: exstr3中 是通過throw ex 拋出異常, 得到的ex.StackTrace則定位到throw ex的位置.