[英]Catch an Exception thrown by another form
我正在尝试这样做:
我正在创建另一个表单,其中的FormClosed方法抛出异常,应该由主表单捕获。
主要表格:
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();
}
调试器在此消息的异常上停止:
用户代码未处理异常
为什么? 我正在捕获创建它的对象的所有者的异常。 有人有想法吗?
我不认为这可以工作,新表单不是在上面的代码上下文中运行,它只是由它启动。 如果你检查堆栈跟踪是否抛出了异常,你就不应该在其中看到上面的代码,因此它无法捕获异常。
更新:我刚刚创建了一个测试项目并尝试了它。 stacktrace对原始表单一无所知。 如果你想捕获未处理的异常,你可能想看看这个问题.NET 1.1中的Unhandled Exception Handler
您可以从program.cs处理项目中的所有异常
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);
}
}
}
你为什么要尝试从一种形式到另一种形式的异常? “不要抛出新的异常()”
如果您试图让主表单知道选项表单已关闭,您可以在主表单上有一个标志,该标志是从选项表单中设置的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.