C#异常不会抛弃父表单

时间:2016-03-17 14:46:50

标签: c# forms exception-handling

我有一个System.Windows.Forms,它启动另一个从自定义表单继承的表单。如果我在第二个表单上创建一个创建异常的按钮,它不会将异常抛回到第一个表单,我在tryDialog()周围尝试捕获。

表格1

    try
            {
                using (var d = new Dialog1())
                {
                    d.ShowDialog();
                }
            }
            catch (Exception x)
            {
            }

表格2

 public partial class Dialog1 : TouchBaseForm
    {
        public Dialog1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
           // var x = K3Data.DigiTickets.API.Api.GetProducsts();
               throw new DivideByZeroException();         
        }
    }

TouchBaseForm继承自Form。

怎么回事?

如何以第一种形式捕获异常?

2 个答案:

答案 0 :(得分:0)

你正在处理它。你的处理程序隐藏了它:

catch (Exception x)
{
}

试试这个:

catch (Exception x)
{
    MessageBox.Show(x.Message);
}

如果这不起作用,请将代码发布到TouchBaseForm,因为问题必须在那里。在我的测试中,异常被捕获并显示出来。

答案 1 :(得分:0)

您可以在this question.

的答案中找到您要找的答案

扩展HansPassant的评论:表单中的事件方法是从事件循环中调用的。 Windows窗体使用事件驱动的编程,而不是您正在考虑的过程模型。

ShowDialog方法创建一个新的事件循环并等待事件循环结束,但它没有"调用"事件循环因此在抛出异常时它不在另一个表单的调用树中。它给人一种你称之为对话的错觉,但你真的不是。微软为那些在事件驱动方式上思考困难的程序员提供了一个支持 - 但如果你尝试在最简单的情况下使用它,你会遇到你在这里遇到的那些问题。

如果您希望第一个表单知道第二个表单中的异常条件,您必须在第二个表单中捕获异常并自行传递信息,使用DialogResult或通过事件机制。