2010-10-30 78 views
3

我有一個用戶控件,它包含多個方法,並且每個方法都有一個try-catch塊。我只捕獲一種類型的異常,例如ArgumentException。更新 - 我沒有發現一個例外,但我定義了多個例外。如何捕獲用戶控件中的所有異常

這些方法都以相同的方式處理ArgumentException,所以我有冗餘代碼。

我可以在一個位置捕獲ArgumentException,以便用戶控件中的所有方法都可以使用它嗎?

Update1:​​該應用程序正在生產中使用,它被很多不熟悉計算機的人使用。簡化 - 他們必須在數據庫中插入大量數字(在手持式光學掃描儀的幫助下),當然他們會犯錯誤。至少有8種常見的異常(錯誤的大小,錯誤的類型......),並且在我的業務邏輯中,我捕獲了所有這些異常並將它們投入GUI。因爲安裝應用程序的環境非常糟糕,所以我會播放大聲的錯誤聲音並顯示錯誤消息。

由於業務邏輯的原因,他們有幾個選項來插入這些數字,因此同一個錯誤捕獲邏輯在用戶控件中都有多種方法。

UPDATE2:其實我沒有趕上ArgumentException的,但我自己的異常,例如 CodeFormatException,CodeDoesntExistException,CodeNotInTheSelectedRollException等

+1

這是口袋妖怪異常處理。你不能處理一個ArgumentException,它是一個編程錯誤。你的catch處理程序不能重寫源代碼來修復這個bug。 – 2010-10-31 20:14:34

+0

我不確定我瞭解你的答案。我更新了我的問題以更好地描述我的問題。 – sventevit 2010-11-01 09:24:19

+0

@Hans Passant:我完全同意你的看法。 – Svisstack 2010-11-01 20:20:28

回答

2

你可以得到這塊代碼到一些驗證參數的功能,並在一開始叫它你的功能的。

1

如果有非託管代碼的權利,你可以重寫你的用戶控件的WndProc方法(如果沒有非託管代碼權限,該應用程序將立即拋出一個異常,如您UserControl類第一次被引用)。鍵盤,鼠標和繪畫事件是由在WndProc中處理的消息引起的,因此請在try ... catch中調用該方法的基本實現來處理這些事件。對於其他人,你將不得不將它們包裝在一個try ... catch中,但是你可以將catch邏輯移到一個從所有catch塊中調用的幫助方法,這樣你就不會複製代碼。

編輯: 其實,我認爲這樣的事情可能會更好。它不需要的權限,你可以用它在你的用戶控件從其他控件激發的事件還有:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Load += new TryCatchHandler(new EventHandler(this.Form1_Load)).EventHandler; 
     this.MouseClick += new TryCatchHandler(new MouseEventHandler(this.Form1_MouseClick)).EventHandler; 

     this.button1.Click += new TryCatchHandler(new EventHandler(this.button1_Click)).EventHandler; 
    } 

    private void Form1_MouseClick(object sender, MouseEventArgs e) 
    { 
     // ... 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // ... 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // ... 
    } 

    private class TryCatchHandler 
    { 
     public Delegate handler; 

     public TryCatchHandler(Delegate handler) 
     { 
      this.handler = handler; 
     } 

     public void EventHandler(object sender, EventArgs e) 
     { 
      try 
      { 
       this.handler.Method.Invoke(this.handler.Target, new object[] { sender, e }); 
      } 
      catch (ArgumentException exc) 
      { 
       // ... 
      } 
     } 
    } 
} 
0

從基類派生的異常,然後重構你的異常處理代碼給接受的方法基本異常類作爲參數。然後你可以根據需要處理異常和傳播。

相關問題