如何捕获用户控件中的所有异常

时间:2010-10-30 19:43:03

标签: .net winforms user-controls

我有一个用户控件,它包含多个方法,每个方法都有一个try-catch块。我只捕获一种类型的异常,例如ArgumentException。更新 - 我没有捕获一个例外,但是我定义了多个例外。

这些方法中的每一个都以相同的方式处理ArgumentException,因此我有冗余代码。

我可以在一个地方捕获ArgumentException,以便用户控件中的所有方法都可以使用它吗?

Update1:​​该应用程序正在生产中使用,并且被许多不太熟悉计算机的人使用。简化 - 他们必须在数据库中插入大量数字(借助手持式光学扫描仪),当然他们会犯错误。至少有8个常见的异常(错误的大小,错误的类型,......),在我的业务逻辑中,我捕获所有这些异常并将它们抛给GUI。因为安装应用程序的环境非常糟糕,所以我会播放一个响亮的错误声音并显示错误消息。

由于业务逻辑,他们有几个选项可以插入这些数字,因此在用户控件中使用多种方法的错误捕获逻辑。

Update2:实际上我没有捕获ArgumentException,而是我自己的异常,例如 CodeFormatException,CodeDoesntExistException,CodeNotInTheSelectedRollException等。

3 个答案:

答案 0 :(得分:2)

您可以将这段代码放入一些验证参数函数中,并在函数的开头调用它。

答案 1 :(得分:1)

如果您有非托管代码权限,则可以覆盖UserControl的WndProc方法(如果您没有非托管代码权限,应用程序将在您UserControl类后立即抛出异常首先被引用)。键盘,鼠标和绘画事件是由WndProc中处理的消息引起的,因此在try ... catch中调用该方法的基本实现来处理这些事件。对于其他人,你必须将它们包装在try ... catch中,但是你可以将catch逻辑移动到一个从所有catch块调用的helper方法,这样你就不会复制代码。

编辑: 实际上,我认为这样的事情会更好。它不需要权限,您也可以将它用于从UserControl上的其他控件触发的事件:

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)
            {
                // ...
            }
        }
    }
}

答案 2 :(得分:0)

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