我有一个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。
怎么回事?
如何以第一种形式捕获异常?
答案 0 :(得分:0)
你正在处理它。你的处理程序隐藏了它:
catch (Exception x)
{
}
试试这个:
catch (Exception x)
{
MessageBox.Show(x.Message);
}
如果这不起作用,请将代码发布到TouchBaseForm
,因为问题必须在那里。在我的测试中,异常被捕获并显示出来。
答案 1 :(得分:0)
您可以在this question.
的答案中找到您要找的答案扩展HansPassant的评论:表单中的事件方法是从事件循环中调用的。 Windows窗体使用事件驱动的编程,而不是您正在考虑的过程模型。
ShowDialog方法创建一个新的事件循环并等待事件循环结束,但它没有"调用"事件循环因此在抛出异常时它不在另一个表单的调用树中。它给人一种你称之为对话的错觉,但你真的不是。微软为那些在事件驱动方式上思考困难的程序员提供了一个支持 - 但如果你尝试在最简单的情况下使用它,你会遇到你在这里遇到的那些问题。
如果您希望第一个表单知道第二个表单中的异常条件,您必须在第二个表单中捕获异常并自行传递信息,使用DialogResult或通过事件机制。