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