Почему Visual Studio не показывает сообщение об исключении, когда мое исключение возникает в статическом конструкторе? - PullRequest
4 голосов
/ 26 марта 2010

Я запускаю этот код C # в Visual Studio в режиме отладки:

public class MyHandlerFactory : IHttpHandlerFactory
{
  private static Dictionary<string, bool> myDictionary = new Dictionary<string, bool>();
  static MyHandlerFactory()
  {
    myDictionary.Add("someKey",true);
    myDictionary.Add("someKey",true); // fails due to duplicate key
  }
}

За пределами статического конструктора, когда я попадаю на строку с ошибкой, Visual Studio выделяет ее и выскакивает сообщение об исключении. Но в статическом конструкторе я не получаю такого сообщения. Я пошагово перебираю строки, так что я знаю, что добираюсь до этой линии и не дальше.

Почему это?

(Я понятия не имею, имеет ли значение тот факт, что мой класс реализует IHttpHandlerFactory, но я включил его на всякий случай.)

Это VS2005, .Net 2.0

Редактировать: Я просто хочу добавить, тот факт, что это HttpHandler действительно , кажется, имеет значение. Как указывалось в ответах, поведение по умолчанию заключается в нарушении TypeInitializationException, а не внутреннего исключения. Я протестировал другой пример без HttpHandler и увидел, что это привело к разрыву программы на первой строке, которая использовала класс. Но в этом случае в моем коде нет строки для разрыва, поскольку класс вызывался только как HttpHandler, указанный в моем файле web.config. Следовательно, это исключение не нарушалось вообще.

Ответы [ 3 ]

8 голосов
/ 26 марта 2010

Проблема в том, что выбрасываемое исключение на самом деле является исключением TypeInitializationException, которое переносит любое выброшенное исключение. Я не уверен, какие компромиссы дизайна вызвали это, но IMO - это одна из самых раздражающих вещей в разработке .NET, и мне грустно видеть, что это все еще существует в .NET 4.

В VS, чтобы поймать исключение как можно скорее, вам нужно включить исключения первого шанса. Перейдите в раздел «Отладка> Исключения» и установите флажок «Общие исключения времени выполнения языка», которые будут прерываться при возникновении исключения.

(Примечание: если вы используете динамическую языковую среду выполнения, вам нужно быть более разборчивым в отношении того, какие исключения перехватываются, поскольку, очевидно, используются исключения для управления потоком).

1 голос
/ 26 марта 2010

Я попробовал ваш код и получил исключение TypeInitializationException, как вы и ожидали. Нет проблем в моем VS ...

Но если вы запускаете это (или любое другое) приложение «без отладки», вы всегда должны получать сообщение об ошибке для любых необработанных исключений - никакие настройки VS здесь не будут иметь значения

0 голосов
/ 26 марта 2010

Статический конструктор запускается до запуска приложения в домене приложения. Это, вероятно, вызывает проблемы с тем, как VS перехватывает исключение, которое из вашего описания совершенно нестандартно. Это может быть ограничение 2005 года. Вот почему вы всегда должны ловить в теле статического конструктора. Это прекрасно обсуждается в новой книге Effective C #

...