此文章是給多層開發的人使用的,小型代碼,或者不理解多層開發的朋友,請繞道.
多層開發已經很普遍,最少有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(.....);
}
此文章只是一個簡單的委託程式,起到拋磚引玉的作用,希望對有些人有些啟發.