无法从Form.Show中捕获异常

3

我有两个表单。我的第一个表单上有一个按钮,当点击按钮时应该加载第二个表单。第二个表单在其Load事件中抛出异常。显示第二个表单的代码在try-catch块中。然而,在点击按钮时,该异常未被捕获到try-catch块中,我会得到一个“未处理异常”窗口。以下是代码:

public partial class FirstForm : Form
{
   private void button_Click(object sender, EventArgs e)
   {
      try
      {
         // Showing this form will throw an exception
         SecondForm form = new SecondForm();
         form.Show();
      }
      catch (Exception ex)
      {
         // The exception is not caught here
         MessageBox.Show(ex.ToString());
      }
   } 
}

public partial class SecondForm : Form
{
   // Throw an exception when this form is shown
   private void form_Load(object sender, EventArgs e)
   {
      throw new Exception("something");
   }
}

为什么我的代码没有捕获到异常?



MSDN论坛上的相关帖子。解决方案不是很清晰,但可能会有所帮助。 - M.Babcock
看看这个 Stack Overflow 的问题(最后一个回答)。 - Jeroen Heier
在发布问题之前,我已经尝试了那些解决方案。在我的构建设置中,“首选32位”选项已经取消选择。我使用的是Windows 10,而那个答案说这个问题在Windows 8及更高版本中已经修复,但我仍然遇到了这个问题。我看到的答案都谈到异常被静默地吞噬或只在调试器运行时出现问题,但这不是我所经历的。我的异常会冒泡并导致程序崩溃,因此它们没有被吞噬,但也不允许我处理它们。 - Ben Rubin
1
这是完全按设计的,Form类中的所有事件都不可捕获异常,Load事件也不例外。你最多只能从Application.UnhandledException事件中得到通知,但在调试时这是有意禁用的。幸运的是,Load事件从不需要您执行任何冒险操作,因此您可以轻松地将代码移动到构造函数中。如果由于某种原因无法这样做,则必须在事件处理程序中使用try/catch。 - Hans Passant
谢谢您的解释。如果您想将其作为答案添加,我会将其标记为正确答案。 - Ben Rubin
1个回答

0

当你显示第二个窗体时,可以使用ShowDialog(this)代替Show方法,以使第一个窗体控制第二个窗体。 即使使用ShowDialog(this),你也无法捕获异常。我认为这个问题已经有了答案在这里


1
我尝试过了,但异常仍然没有在我的try-catch中被捕获。 - Ben Rubin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接