Я делал некоторые модульные тесты кода, которые могли бы вызывать ряд исключений в зависимости от входов. Так что я пытался что-то вроде кода ниже: (упрощенное для примера)Почему я не могу получить общее исключение в C#?
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();
}
Но это всегда будет печатать «Caught общего исключения», то улова (T текс) обработчика никогда не будет работать. Неважно, бросаю ли я T() или явно бросаю ArgumentException(). Есть идеи, почему это так? На самом деле я был удивлен тем, что даже смог использовать T в ловушке, но так как это возможно, это не должно работать? Или, по крайней мере, дать предупреждение/ошибку компилятора, в котором говорится, что этот обработчик никогда не будет работать?
Моей средой является Visual Studio 2008 и 3.5 является целевой структурой.
UPDATE: Я попробовал это прямо сейчас из командной строки, а затем распечатывает «Попал в тип исключения». Таким образом, похоже, что это ограничено запуском из Visual Studio. Может быть, особенность хостинга Visual Studio?
Я просто проверял в LINQPad и распечатаны Пойманный прошел по типу исключения. Можете ли вы дать более подробную информацию о своей среде и каркасной версии. –
Это интересно. Я запускал его как консольное приложение в VS2008, и он печатал Caught general exception. –
Также работает в SnippetCompiler –