2009-10-16 1 views
39

Я делал некоторые модульные тесты кода, которые могли бы вызывать ряд исключений в зависимости от входов. Так что я пытался что-то вроде кода ниже: (упрощенное для примера)Почему я не могу получить общее исключение в 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?

+1

Я просто проверял в LINQPad и распечатаны Пойманный прошел по типу исключения. Можете ли вы дать более подробную информацию о своей среде и каркасной версии. –

+2

Это интересно. Я запускал его как консольное приложение в VS2008, и он печатал Caught general exception. –

+0

Также работает в SnippetCompiler –

ответ

32

Необычное поведение здесь ...

VS2k8 консольное приложение. Следующее:

try 
{ 
    throw new T(); 
} 
catch (T tex) 
{ 
    Console.WriteLine("Caught passed in exception type"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Caught general exception"); 
} 

приводит к "Caught общего исключения".

Но, Убрать (бесполезный) переменные из заявлений улова:

try 
{ 
    throw new T(); 
} 
catch (T) 
{ 
    Console.WriteLine("Caught passed in exception type"); 
} 
catch (Exception) 
{ 
    Console.WriteLine("Caught general exception"); 
} 

результатов в "Caught прошел по типу исключения" !!!


Update:

Heheh ... Его ошибка: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

Источник? Вот. Why does catch(TException) handling block behaviour differ under the debugger after installing Visual Studio 2008?

2

Казалось бы, что наиболее конкретный тип исключения, когда дано выбор между T и Exception - исключение, и поэтому вызывается обработчик.

Я просто попробовал это (вы не можете сделать это на C# или VB, но я отредактировал IL) и изменил второе предложение catch, чтобы уловить объект Ex, а не Exception Ex, и в этом случае первый обработчик получил удар.

Редактировать

Как уже отмечалось, это больше связано с запустив его в отладчике, чем конкретный тип

Смежные вопросы