Почему поведение блока catch (TException) отличается от отладчика после установки 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
{
}

В следующих случаях код ведет себя как ожидалось:

  • Если построено с конфигурацией "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

Что вызывает этот странный провал?

Ответ 1

Это странно. Я подтвердил, что проблема существует и с VB.Net, поэтому это не проблема с С#. Он должен быть подтвержден основной командой отладчика, но он выглядит как ошибка.

Пожалуйста, напишите ошибку Connect и опубликуйте номер ошибки в качестве комментария к моему OP, чтобы я мог убедиться, что он направляется в правильную команду.

Ответ 2

Это известная проблема, вызванная ошибкой в ​​CLR. Он был исправлен в CLR 4.0 (пока еще не выпущен).

Спасибо JaredPar за помощь в этом. Подробнее см. Комментарии к его ответу и ссылку на исходный отчет об ошибке в Microsoft Connect.