考虑下面的控制台应用程序,其特色是具有捕获类型异常的通用catch处理程序的方法TException
.
当使用"调试"配置构建此控制台应用程序并在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 <{0}>...", typeof(TException).Name); try { throw new TestException(); } catch (TException ex) { Console.WriteLine("*** PASS! ***"); } catch (Exception ex) { Console.WriteLine("Caught <{0}> 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();
第1行来附加调试器Main()
仍然成功.
从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
造成这种特殊故障的原因是什么?
这确实很奇怪.我验证了VB.Net也存在这个问题所以它不是C#特有的问题.它需要由核心调试器团队确认,但它确实看起来像一个bug.
请在Connect上提交一个错误并将错误号作为评论发布到我的OP,这样我就可以确保它被路由到正确的团队.