为什么WPF会吞掉在Window.Activated事件处理程序中抛出的异常?

8 浏览
0 Comments

为什么WPF会吞掉在Window.Activated事件处理程序中抛出的异常?

为什么当在处理程序中抛出异常且在其他地方未处理时,我期望应用程序会中断,但实际上它没有。WPF似乎在某个地方吞噬了异常,窗口弹出并继续正常运行。为什么呢?

0
0 Comments

这个问题可能与在64位操作系统上运行32位应用程序有关。如果是这种情况,那么Paul Betts的博客文章应该能够给出一个很好的解释。简而言之,对于32位进程,.NET框架会吞噬异常,这是由于异常在用户模式/内核模式边界传播时出现问题。对于64位进程,这种情况不会发生,所以测试是否存在这个问题的最简单方法是使用“Any CPU”平台重新构建测试应用程序并再次运行。当我这样做时,它像预期的那样崩溃了。

解决方法:

要解决这个问题,可以尝试以下方法之一:

1. 将应用程序重新构建为“Any CPU”平台,而不是32位平台。这样可以避免异常被吞噬的问题。

2. 在事件处理程序中添加适当的异常处理逻辑,以确保异常被捕获并进行处理,而不是被框架吞噬。

例如,可以使用以下代码来捕获并处理异常:

private void Window_Activated(object sender, EventArgs e)
{
    try
    {
        // Event handler code
    }
    catch (Exception ex)
    {
        // Handle the exception
    }
}

通过添加适当的异常处理逻辑,可以确保异常不会被框架吞噬,并能够对其进行处理。

总之,WPF在Window.Activated事件处理程序中吞噬异常的问题可能与在64位操作系统上运行32位应用程序有关。通过重新构建应用程序为“Any CPU”平台或添加适当的异常处理逻辑,可以解决这个问题。

0