考虑下面的情况:Form1通过调用"System.Windows.Forms.Form.ShowDialog"以模态对话框的形式启动Form2,并在GUI线程上引发异常。如果我从Visual Studio调试器中运行此程序,则可以在Form1中的调用位置捕获此异常(这是我没有预料到的!)。如果我不使用附加调试器的方式运行程序,即使稍后附加调试器,我也无法从Form1中捕获异常(这更符合我的期望)。
为什么在调试器中运行时,我可以在Form1中捕获异常?或者更重要的问题是,为什么调试器的存在会改变“ShowDialog”的异常抛出行为?
以下代码足以证明此问题。
为什么在调试器中运行时,我可以在Form1中捕获异常?或者更重要的问题是,为什么调试器的存在会改变“ShowDialog”的异常抛出行为?
以下代码足以证明此问题。
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
public class Form1 : Form
{
public Form1()
{
this.MouseClick += this.OnMouseClick;
}
private void OnMouseClick(object sender, MouseEventArgs e)
{
try
{
var f2 = new Form2();
f2.ShowDialog(this);
}
catch (System.Exception ex)
{
MessageBox.Show(this, ex.Message, "Exception Caught!",
MessageBoxButtons.OK, MessageBoxIcon.Information
);
}
}
}
public class Form2 : Form
{
public Form2()
{
this.MouseClick += this.OnMouseClick;
}
private void OnMouseClick(object sender, MouseEventArgs e)
{
throw new Exception("Hey! That hurts!");
}
}
}