在C#中,當出現某種異常時,就會創建一個異常對象。這個對象包含有助於跟蹤問題的信息。
我們可以創建自己的異常類,但.NET已經提供了許多預定義的異常類
異常類Exception
SystemException 這個是由公共語言運行庫引發的異常,派生於systemExecption類
ApplicationException 由用戶程序執行的異常,派生於ApplicationException類
try-catch語句由一個try塊後跟一個或多個catch子句構成
在catch塊中可以使用throw語句再次引發已由catch語句捕獲異常
throw語句用於發出在程序執行期間出現反常情況(異常)的信息。引發的異常是一個對象,該對象的類是從System.Exception派生的。
通常throw語句與try-catch或try-finally語句一起使用。當引發異常時,程序查找處理此異常的catch語句。也可以用throw語句重新引發已捕獲的異常。
try
{
//............
}
//捕獲異常
catch(Exception ex)
{
//再次引發異常
throw new Exception(ex.ToString());
}
System.Exception的常用屬性
GetType() 獲取異常的類型
HelpLink 連接到一個幫助文件上,以提供該異常的更多信息
Message 描述錯誤情況的文本(告訴用戶發生了什麼事)
Source 導致異常的應用程序或對象名
StackTrace 堆棧上方法調用的信息,它有助於跟蹤引發異常的方法,確定錯誤發生的位置,如果有可用的調試信息(即有<程序名>.pdb文件存在),還可以顯示源文件名和程序行號。
TargetSite 引發異常的方法的.NET反射對象
InnerException 如果異常是在catch塊中引發的,它就會包含把代碼發送到catch塊中的異常對象
比如:
在一個類中定義自己的異常類:
public class ExceptionClass : Exception
{
public ExceptionClass(string mess):base(mess)
{
}
}
在另一個類中定義:
public class Test
{
public string TestMod(int testmun)
{
if (testmun==0)
{
//拋出異常信息
throw new ExceptionClass("發生了爲0的異常");
}
else
{
return "正常返回";
}
}
}
主程序調用:
static void Main(string[] args)
{
Test a = new Test();
try
{
string re = a.TestMod(0);
System.Windows.Forms.MessageBox.Show(re);
}
catch (ExceptionClass ecc)
{
System.Windows.Forms.MessageBox.Show(ecc.Message);
}
}
關於CLR的 “兩輪遍歷”異常處理策略。
當應用 程序擁有多層嵌套的異常捕獲結構時,如果最底層(其實在中間層也一樣)發生了異常,CLR將優先在引發異常的那一層去搜索catch語句塊,看看有沒有“兼容”
此類型異常的處理代碼 ,如果沒有,就“跳到”上一層去搜索,如果上一層還沒有,繼續搜索上一層的“上一層”,由此直到應用 程序的最頂層。
這就是CLR處理嵌套異常捕獲結構應用程序的“第一輪”遍歷-----查找合適的異常處理程序。
如果在某一層找到了異常處理程序,注意,CLR並不會馬上執行之,而是回到"事故現場",再次進行“第二輪”遍歷,執行所有“中間”層次的finally 語句塊,然後,執行
找到異常處理程序 ,最後,再從本層開始一直遍歷到最頂層,執行所有的finally語句塊。
這個“兩輪遍歷”的異常處理策略是所有.NET程序員都必須瞭解的。