.Net 異常處理

在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程序員都必須瞭解的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章