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

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

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

private void Form1_Load(object sender, EventArgs e){
    throw new Exception("Hey");            }

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

我在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());        }

我想知道为什么它没有显示数字。然后将代码移动到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());        }

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

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



Qyouu
浏览 391回答 3
3回答

明月笑刀无情

重写,我已经弄清楚它来自哪里。Windows在64位版本的Windows 7上运行时,如果在32位进程中引发异常,Windows会出现异常。它会吞下由响应由64位Windows管理器触发的Windows消息而运行的代码引发的任何异常。与WM_SHOWWINDOW一样,导致Load事件被引发的消息。调试器起作用,因为当它处于活动状态时,Winforms应用程序中的正常异常捕获被关闭以允许调试器停止异常。在这种情况下不会发生这种情况,因为Windows 7首先吞下异常,阻止调试器看到它。

jeck猫

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

繁星coding

WinForms框架类不会自动捕获任何异常。这不是一个错误,它是设计 - 他们会做什么与例外?您必须在任何情况下拥有自己的try / catch块,或者处理Application.ThreadException事件。该事件对于某些通用处理代码(如记录异常或显示错误对话框)很有帮助,但显然它不能对任何单个事件或异常类型执行任何特定操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java