C# WinForm应用程序c中的异常吞咽#

C# WinForm应用程序c中的异常吞咽#,c#,winforms,numericupdown,C#,Winforms,Numericupdown,而Program.cs有如下捕捉块 public partial class Form1 : Form { public class abc { public static decimal Divide(int a,int b) { return a / b; } } public Form1() {

而Program.cs有如下捕捉块

public partial class Form1 : Form
    {
        public class abc
        {
            public static decimal Divide(int a,int b)
            {
                return a / b;
            }
        }
        public Form1()
        {
            InitializeComponent();
            numericUpDown1.ValueChanged += NumericUpDown1_ValueChanged;
            numericUpDown1.Controls[1].Leave += Form1_Leave;
        }

        private void Form1_Leave(object sender, EventArgs e)
        {
            //abc.Divide(15, 0);
        }

        private void NumericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            abc.Divide(15, 0);
        }
    }

在上面的示例中,未触发任何消息框。但如果我使用leave事件,则执行catch。为什么ValueChanged事件不适用于外部世界?

将您的代码更改为:

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.ThreadException += Application_ThreadException;
            try
            {
                Application.Run(new Form1());
            }
            catch
            {
                MessageBox.Show("Exception Hadled");
            }
        }

        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            MessageBox.Show("Exception Hadnled");
        }
    }

事实并非如此,这是有意为之。没有“尝试/捕获”应用程序。运行()

您的Form_Leave事件处理程序也应该具有相同的行为

当您使用
Application.Run()
启动程序时,它会启动一个消息循环并创建一个ThreadContext和ApplicationContext

消息循环处理发送到活动窗体的窗口消息(比如在数字控件上按下Tab键),并执行所需的操作

这是第一次获取异常时处理异常的方法:

 try
        {
            Application.Run(new Form1());
        }
        catch (Exception)
        {
            MessageBox.Show("Exception Hadled");
        }
现在OnThreadException调用您的
应用程序\u ThreadException

让我们试着再扔一次

internal void UpdateFocusedControl() in ContainerControl:

try {
    leaveControl.NotifyLeave();
}
catch (Exception e) {
    Application.OnThreadException(e);
}
下次,该异常将由ThreadContext处理

private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    MessageBox.Show("Exception Handled");
    throw e.Exception;
}
最后,当您重新抛出时,这一次您的catch语句被激活


希望这能澄清您的问题。

它确实在我的机器和.net 4.7.2中提出了异常。您使用的是什么版本?删除
try/catch
应用程序周围的块。运行(new Form1())这没有任何区别。。。特别是如果你甚至没有给它赋值。这与关闭
(异常)
部件完全相同。Form1\u Leave通过向catch块发送异常来处理文本框离开事件及其工作状态。使用catch-around Application.Run的想法是显示我自己的表单,用我的语言解释异常。我仍然不清楚值更改事件与文本框离开事件有何不同。是的,不应该如此,因为我直接从源代码中确认了这种行为。我会进一步研究。
internal bool PreTranslateMessage(ref NativeMethods.MSG msg) in Application+ThreadContext

try
{
    // Message processing, like leave control and focus next and call event handlers
}
catch (Exception e)
{
    OnThreadException(e);
}