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

标签 winforms exception

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

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

我在该代码中没有收到任何错误,不久前,我正在尝试为这个问题制定解决方案 Parse a number from a string with non-digits in between

我在 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字符串 t = s.ToCharArray().TakeWhile...

最佳答案

重写,我已经弄清楚它来自哪里。当 32 位进程在 64 位版本的 Windows 7 上运行时,在 32 位进程中引发异常时,Windows 行为不正常。它会吞下由响应由 64 位 Windows 管理器触发的 Windows 消息而运行的代码引发的任何异常.与 WM_SHOWWINDOW 类似,该消息会导致引发 Load 事件。

调试器发挥作用是因为当它处于事件状态时,Winforms 应用程序中的正常异常捕获将被关闭,以允许调试器在出现异常时停止。在这种情况下不会发生这种情况,因为 Windows 7 首先吞下异常,防止调试器看到它​​。

我在 this answer 中更广泛地描述了这个问题。 ,以及可能的解决方法。

关于winforms - 为什么表单加载无法捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209706/

相关文章:

c# - 更改 WinForm 按钮文本颜色?

ruby-on-rails - 什么东西是抓不到的?

mysql - 引发 MysqlError; raise Mysql::Error 都有效,这是怎么发生的?

java - Android + MySQL 使用 com.mysql.jdbc.Driver

android - 使用 UncaughtExceptionHandler 捕获异常但显示崩溃对话框

c# - 如何查看用第二个线程显示的对话框的 Windows 消息?

c# - 从一个 TreeView 拖放到另一个 TreeView - WinForms

c# - 有多个入住/退房/午餐时间并获取总时间

java - 如何启用日志返回日志堆栈跟踪和未捕获的异常

c# - Windows.Form 不触发 keyDown 事件