C# 如何處理拋出的異常,或者已知的錯誤

來源:互聯網
上載者:User

此文章是給多層開發的人使用的,小型代碼,或者不理解多層開發的朋友,請繞道.

多層開發已經很普遍,最少有2層.
1:表現層(顯示資料,圖形處理,等等)
2:處理層(邏輯處理,具體執行操作)

或者可以分得更細,具體問題具體分析嘛.

但是,在多層中,總是會有錯誤發生,大多數錯誤都是可以捕捉到的,或者是已經知道會發生的.
那麼,如果在某一層拋出異常,怎麼辦?難道像某些人說的一層一層向上遞迴,最後在顯示層顯示?
這當然是不現實的!

當然,程式碼封裝括2部分:1健壯的代碼 2:懷疑的代碼
健壯的代碼意思是:出錯的幾率很低,幾乎不可能出錯
懷疑的代碼意思是:可能會在某種情況下出錯,比如資料庫連接,誰知道什麼時候資料庫會出現問題呢.

(1)我可以這麼設計,一個模組,專門處理異常,或者一個類專門處理異常.
那這個異常類本身如果出現問題,那隻能忽略.
如果異常類本身出現異常,如果不忽略,那就會調用自身,自身異常反覆調用直到堆棧益出.
所以:總結一點,錯誤處理類(模組)必須健壯,並且一但本身出錯,忽略,不能再次調用本身的錯誤處理功能.

(2)那麼,這個處理類該怎麼寫呢?
1:處理類 public class Exeception{} //專門用於處理錯誤
2:錯誤訊息 public class ExeceptionMessage{} //用於描述錯誤資訊,和錯誤類型
但這裡有個問題,處理類太死板了.而且一般錯誤處理類是寫在程式的最底層的.
程式的層之間是單向的,不能出來依賴調用問題.(高層調用底層,底層不能調用高層)
所以,按這個邏輯,這個錯誤處理類如果寫在底層,如何讓高層的顯示層顯示呢?
那怎麼辦?事件委託就可以OK了.(具體事件可以在程式載入時由顯示層注入)

我大概說一下方案,具體實現要你們自己實施.(當然我寫的比較粗糙)
//錯誤訊息
public class ExeceptionMessage
{
         public string Name;//錯誤名稱
         public string Source;//錯誤來源
         public string Message;//錯誤具體的描述
         public int Leave;//錯誤等級,比如-1表示必須停止程式,0表示警告 1表示提示.
}

//-->在這裡,先寫事件,因為過後會要用到
//錯誤參數,事件用到的函數參數
public class ExeceptionEventArgs:EventArgs//必須從EventArgs繼承.
{
         public ExeceptionMessage ExeceptionMessage;

        public ExceptionEventArgs(){}//預設構造

        //構造並給一個值給成員 ExeceptionMessage 以便參數傳遞
        public ExeceptionEventArgs(ExeceptionMessage m)
        {
             ExeceptionMessage=m;
        }
}

//定義錯誤委託聲明(參數就是上面剛剛申明的)
public delegate void ExeceptionEventHandle(ExeceptionEventArgs e);

//主要的東西來了,這就是錯誤處理主程式
//我寫的比較簡單,大家可以自由發揮
public class Exeception
{
       //委託事件執行個體,就是那個delegate建出來的,但執行個體時,必須用event
       //建了這個,就會出現類似OnClick+=那種閃電類型,嘿嘿
       public event ExeceptionEventHandle OnExeception;

       //處理主函數
       public void ThrowExeception(ExeceptionMessage m)
      {
            //這裡省略,你可以寫一些自己的基本代碼
            //....比如你可以建一個錯誤清單等等,隨你
            if(m!=null && OnExeception!=null)//檢查錯誤訊息是否為空白&錯誤事件是否為空白
            {
                  //調用剛才建立的委託執行個體.
                  OnExeception(new ExeceptionEventArgs(m));

                   //這裡看等級,看看要不要終止程式
                  if(m.Leave==-1)
                   {
                      ........//程式停止代碼
                   }

            }
            else{.......//如果傳來的錯誤訊息有問題,忽略(我在這故意這麼寫的)}
        }
}

這樣一個簡單的錯誤處理就出來了,當然,這個模型本身沒有任何的處理事件

事件要靠注入(我用了注入這個名字,因為我覺得更恰當些)

如何使用呢?

在整個程式初始化過後,或者某個自己認為恰當的地方,把某個函數注入進去

//打比方在主函數注入.
//注意:前提是錯誤處理類是一個靜態函數.(當然我寫的不是靜態,你可以改)
//程式就一般只有一個錯誤處理模組,可以寫成靜態.
public static void Main()
{
      //這裡就可以注入一個與錯誤處理類無關的顯示函數了.
      //這就實現了錯誤處理與表現無關的問題.
      //你可以在任何的層拋出異常,並由表現層來顯示.
      Exeception.OnExeception+=new ExeceptionEventHandle(.....);
}

 

此文章只是一個簡單的委託程式,起到拋磚引玉的作用,希望對有些人有些啟發.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.