C# WinForm应用程序c中的异常吞咽#
而Program.cs有如下捕捉块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() {
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);
}