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

Dan*_*nov 9 .net c# visual-studio-2008 visual-studio

考虑下面的控制台应用程序,其特色是具有捕获类型异常的通用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<TestException>();

        Console.ReadKey();
    }

    private static void CatchAnException<TException>()
        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
{
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果使用"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 <TestException>...
*** FAIL! ***

Caught <TestException> in 'catch (Exception ex)' handler.
  Expected: <TestException>
    Actual: <TestException>
  Result of typeof(TException) == ex.GetType() is True
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 9

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

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