捕获另一个表单抛出的exception

我正在尝试这样做:

我正在创建另一个表单,其中的FormClosed方法抛出exception,应该由主表单捕获。

主要表格:

try { frmOptions frm = new frmOptions(); frm.ShowDialog(); } catch(Exception) { MessageBox.Show("Exception caught."); } 

frmOptions:

 private void frmOptions_FormClosed(object sender, FormClosedEventArgs e) { throw new Exception(); } 

调试器在此消息的exception上停止:

用户代码未处理exception

为什么? 我正在捕获创建它的对象的所有者中的exception。 有人有想法吗?

我不认为这可以工作,新表单不在上面的代码上下文中运行,它只是由它启动。 如果检查堆栈跟踪是否抛出exception,则不应在其中看到上面的代码,因此无法捕获exception。

更新:我刚刚创建了一个测试项目并尝试了它。 stacktrace对原始表单一无所知。 如果你想捕获未处理的exception,你可能想看看.NET 1.1中的未解决的exception处理程序这个问题

您可以从program.cs处理项目中的所有exception

 static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); Application.Run(new MainMDI()); } static void Application_ThreadException(Object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, "Application.ThreadException"); } static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e) { MessageBox.Show(((Exception)e.ExceptionObject).Message, "AppDomain.UnhandledException"); } } 

您将能够执行以下操作:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(this); form2.Show(); } public void HandleForm2Exception(Exception ex) { MessageBox.Show("EXCEPTION HAPPENED!"); } } 

在Form2.cs上

 public partial class Form2 : Form { private Form1 form1; public Form2(Form1 form1) : this() { this.form1 = form1; } public Form2() { InitializeComponent(); } private void Form2_FormClosed(object sender, FormClosedEventArgs e) { try { throw new Exception(); } catch (Exception ex) { if(this.form1 != null) this.form1.HandleForm2Exception(ex); } } } 

你为什么要尝试从一种forms到另一种forms的exception? “不要抛出新的exception()”

如果您试图让主表单知道选项表单已关闭,您可以在主表单上有一个标志,该标志是从选项表单设置的。