異常處理-C#

Exception.jpg

? 異常處理是指程序在運行過程中,發(fā)生錯誤會導致程序退出,這種錯誤,就叫做異常。

因此處理這種錯誤,就稱為異常處理。

異常處理機制

? 在C#中的異常處理機制是使用使用try, catch,finally代碼塊進行處理。

  1. try塊

    在try塊中包含會拋出異常的代碼;而且一個try快必須關聯catch或者finally。

  2. 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{//捕捉所有拋出的試列
            ...
        }
    }
    
  3. 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的位置.

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容