Рассмотрим консольное приложение ниже, в котором показан метод с общим обработчиком улов, который ловит исключения типа 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
{
}
В следующих случаях код ведет себя как ожидалось:
- Если построено с конфигурацией "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
Что вызывает этот странный провал?