为什么安装Visual Studio 2008后,调试器下的catch(TException)处理块行为会有所不同?

考虑下面的控制台应用程序,其特色是具有捕获TException类型exception的通用catch处理程序的方法。

当使用“调试”配置构建此控制台应用程序并在Visual Studio调试器下执行时(即通过* .vshost.exe),这在Visual Studio 2005和Visual Studio 2008中都会失败。

我相信这个问题只是在我安装Visual Stuido 2008之后才出现的。

 using System; class Program { static void Main() { Console.WriteLine(Environment.Version); CatchAnException(); Console.ReadKey(); } private static void CatchAnException() where TException : Exception { Console.WriteLine("Trying to catch a ...", typeof(TException).Name); try { throw new TestException(); } catch (TException ex) { Console.WriteLine("*** PASS! ***"); } catch (Exception ex) { Console.WriteLine("Caught  in 'catch (Exception ex)' handler.", ex.GetType().Name); Console.WriteLine("*** FAIL! ***"); } Console.WriteLine(); } } internal class TestException : Exception { } 

在以下情况下,代码按预期运行:

  • 如果使用“Release”配置构建,则会成功。
  • 如果直接通过* .exe执行,而不是通过Visual Studio(F5)执行,则会成功。
  • 如果通过放入System.Diagnostics.Debugger.Launch();附加调试器System.Diagnostics.Debugger.Launch();Main()第1行,它仍然成功。

从Visual Studio(2005或2008)中启动控制台应用程序,因此在ConsoleApplication.vshost.exe下执行时,它将失败。

这是我失败案例的输出

 2.0.50727.3068 Trying to catch a ... *** FAIL! *** Caught  in 'catch (Exception ex)' handler. Expected:  Actual:  Result of typeof(TException) == ex.GetType() is True 

造成这种特殊故障的原因是什么?

这确实很奇怪。 我validation了VB.Net也存在这个问题所以它不是C#特有的问题。 它需要由核心调试器团队确认,但它确实看起来像一个bug。

请在Connect上提交一个错误并将错误号作为评论发布到我的OP,这样我就可以确保它被路由到正确的团队。

这是由CLR中的错误引起的已知问题。 它已在CLR 4.0中修复(尚未发布)。

感谢JaredPar对此的帮助。 有关更多详细信息,请参阅有关其答案的评论,并链接到Microsoft Connect上的原始错误报告 。