Я делал некоторое модульное тестирование кода, которое могло бы вызывать ряд исключений в зависимости от входов. Поэтому я попробовал что-то вроде приведенного ниже кода: (упрощен для примера)
static void Main(string[] args)
{
RunTest<ArgumentException>();
}
static void RunTest<T>() where T : Exception, new()
{
try
{
throw new T();
//throw new ArgumentException(); <-- Doesn't work either
}
catch (T tex)
{
Console.WriteLine("Caught passed in exception type");
}
catch (Exception ex)
{
Console.WriteLine("Caught general exception");
}
Console.Read();
}
Но это всегда будет печатать "Обходное общее исключение", обработчик catch (T tex) никогда не будет работать. Неважно, бросаю ли я T() или явно бросаю ArgumentException(). Есть идеи, почему это так? На самом деле я был удивлен тем, что даже смог использовать T в предложении catch, но так как это не должно работать? Или, по крайней мере, дать предупреждение/ошибку компилятора, в котором говорится, что этот обработчик никогда не будет работать?
Моя среда - это Visual Studio 2008, а 3.5 - целевая структура.
UPDATE: я попробовал это прямо сейчас из командной строки, а затем распечатывает "Попал в тип исключения". Таким образом, похоже, что это ограничено запуском из Visual Studio. Может быть, особенность хостинга Visual Studio?