c# - 为什么在安装 Visual Studio 2008 后,catch(TException) 处理 block 行为在调试器下有所不同?

标签 c# .net visual-studio visual-studio-2008

考虑下面的控制台应用程序,它具有一个带有通用捕获处理程序的方法,该处理程序捕获类型为 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
{
}

在以下情况下,代码的行为符合预期:

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

当控制台应用程序从 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

是什么导致了这种特殊的故障?

最佳答案

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

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

关于c# - 为什么在安装 Visual Studio 2008 后,catch(TException) 处理 block 行为在调试器下有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/700935/

相关文章:

c# - 包含关键字的 Linq 不同记录

c - fopen 有什么不安全的地方?

c# - 如何创建在 Visual Studio 中使用的新语言

c# - 如何使用 MSBuild 注册一个 dll

c# - .NET - 扩展列表类中的 FindIndex() 编译错误

c# - 如何在我的 View 模型中获取鼠标位置

c# - Json Formatting.Indented 使用 Web Api Controller, ASP.NET MVC

.net - 从多个线程调用 Console.WriteLine

c# - IOException with File.Copy() 尽管之前有 File.Exists() 检查

c# - 将 double 转换为整数