为什么WPF会吞掉在Window.Activated事件处理程序中抛出的异常?
这个问题可能与在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”平台或添加适当的异常处理逻辑,可以解决这个问题。