Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何捕获用户控件中的所有异常_.net_Winforms_User Controls - Fatal编程技术网

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

.net 如何捕获用户控件中的所有异常,.net,winforms,user-controls,.net,Winforms,User Controls,我有一个用户控件,它包含多个方法,每个方法都有一个try-catch块。我只捕获一种类型的异常,例如ArgumentException。更新-我不捕获一个异常,而是捕获我定义的多个异常 这些方法中的每一个都以相同的方式处理ArgumentException,因此我有多余的代码 我可以在一个地方捕获ArgumentException,以便用户控件中的所有方法都使用它吗 更新1:该应用程序正在生产中使用,许多不太熟悉计算机的人都在使用它。简化-他们必须在数据库中插入大量数字(借助手持式光学扫描仪),

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

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

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

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

由于业务逻辑的原因,它们有几个选项来插入这些数字,因此在用户控件的多个方法中都有相同的错误捕获逻辑

更新2:事实上,我并没有捕获ArgumentException,而是捕获我自己的异常
CodeFormatException、CodeDoesNotExistException、CodeNotInSelectedRollException等。

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

如果您具有非托管代码权限,则可以重写UserControl的
WndProc
方法(如果您没有非托管代码权限,应用程序将在第一次引用
UserControl
类时立即引发异常)。键盘、鼠标和绘制事件是由在
WndProc
中处理的消息引起的,因此请在try…catch中调用该方法的基本实现来处理这些事件。对于其他事件,您必须将它们分别包装在try…catch中,但您可以将catch逻辑移动到从所有catc调用的助手方法h块,这样您就不会复制代码

编辑: 实际上,我认为这样可能更好。它不需要权限,您也可以将其用于从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)
            {
                // ...
            }
        }
    }
}

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

这是口袋妖怪异常处理。您无法处理ArgumentException,这是一个编程错误。您的捕获处理程序无法我写源代码来修复这个错误。我不确定我是否理解你的答案。我更新了我的问题以更好地描述我的问题。@Hans Passant:我完全同意你的看法。我在global.asax中搜索类似异常处理的东西。。。