2010-10-30 48 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

从基类派生的异常,然后重构你的异常处理代码给接受的方法基本异常类作为参数。然后你可以根据需要处理异常和传播。