为什么表单加载无法捕获异常?

Hao*_*Hao 15 exception winforms

这是Winforms中的错误吗?(在VS2008和VS2010上测试)

private void Form1_Load(object sender, EventArgs e)
{
    throw new Exception("Hey");            
}
Run Code Online (Sandbox Code Playgroud)

我没有在那段代码中收到任何错误,前一段时间,我正在尝试为这个问题制定解决方案从一个字符串中解析一个数字,其中包含非数字

我在Form1_Load中执行此代码:

private void Form1_Load(object sender, EventArgs e)
{
    MessageBox.Show("X");
    string s = "12ACD";
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString();
    MessageBox.Show("Y");
    int n = int.Parse(t);
    MessageBox.Show(n.ToString());        
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它没有显示数字.然后将代码移动到button1_Click ...

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("X");
    string s = "12ACD";
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString();
    MessageBox.Show("Y");
    int n = int.Parse(t);
    MessageBox.Show(n.ToString());        
}
Run Code Online (Sandbox Code Playgroud)

...然后我注意到有一个错误:输入字符串的格式不正确.

为什么Form1_Load没有捕获任何异常,为什么它会默默地失败?代码刚刚退出form1_load at string t = s.ToCharArray().TakeWhile ...

Han*_*ant 21

重写,我已经弄清楚它来自哪里.Windows在64位版本的Windows 7上运行时,如果在32位进程中引发异常,则会出现异常.它会吞下由响应由64位Windows管理器触发的Windows消息而运行的代码引发的任何异常.与WM_SHOWWINDOW一样,导致Load事件被引发的消息.

调试器起作用,因为当它处于活动状态时,Winforms应用程序中的正常异常捕获被关闭以允许调试器停止异常.在这种情况下不会发生这种情况,因为Windows 7首先吞下异常,阻止调试器看到它​​.

我在这个答案中更广泛地写了这个问题,以及可能的解决方法.


Gra*_*ger 5

请参阅:OnLoad异常消失的情况.它是按设计进行的(尽管极其愚蠢的设计,IMO).您的异常是在展开堆栈期间遇到内核模式边界.如果可以,切换到其他一些事件,或者不要让异常逃脱; 如果你期望你的调试器在OnLoad上自动中断未处理的异常,这没有用.

如果你关心,我在这个答案中写了更多.