VS2010 не прервал отладку при исключении статического конструктора - PullRequest
4 голосов
/ 10 февраля 2012

У меня есть приложение Windows Forms с единственным классом Editor (который наследуется от Form).

public partial class Editor : Form
{
    public Editor()
    {
        InitializeComponent();

        Load += Editor_Load;
    }

    private void Editor_Load(object sender, EventArgs e)
    {
        cmbConnections.DataSource = ConnectionManager.Connections;
        cmbConnections.Visible = false;
    }

}

Кроме кода, созданного дизайнером, это единственный код для формы (который содержит только один поле со списком (cmbConnections).

Класс ConnectionManager является статическим классом со статическим конструктором. Его конструктор выполняет некоторую инициализацию, а затем проверяет наличие некоторого критического условия. Если условиеСоблюдается, конструктор выдает исключение. Однако это исключение не прерывается в режиме отладки в Visual Studio 2010. Чтобы проверить это, я поместил только throw new Exception() в статический конструктор ConnectionManager. ConnectionManagerиспользуется и для этого инициализируется (впервые) в обработчике события * 1013. * Вызывается статический конструктор и генерируется исключение (отображается только в окне вывода). Остальная часть обработчика события Editor_Load (cmbConnections.Visible = false;) невыполнено, как и ожидалось.

Но я не понимаю, , почему мой VS2010 проглотил исключение? Он не прервал отладку. Это яне включены ни в один блок try / catch.Продолжилось выполнение программы с главным окном.Кажется, что Editor_Load был выполнен в другом потоке.

Я вижу сообщения в окне вывода:

Исключение первого шанса типа 'System.InvalidOperationException' произошло в Editor.exe

Исключение первого шансатипа «System.TypeInitializationException» произошла в Editor.exe

, но выполнение просто не прервалось в режиме отладки.

Вот некоторые из моих опций, которые, я считаю, могут повлиять на этоповедение:

Свойства проекта-> Build-> General-> Optimize code UNCHECKED.

Tools-> Options-> Debugging-> General-> Enable Just My Code is CHECKED.

В настройках исключений установлен флажок для "необработанного пользователя".

Я что-то упустил?Это нормальное поведение?Я думал, что VS2010 скинет на ЛЮБОЕ необработанное исключение.И вот этот не обработан и до сих пор не ломается.

1 Ответ

1 голос
/ 10 февраля 2012

Я думаю, что именно по проекту вам нужно включить управляемые (.NET) исключения, «выброшенные» в диалоге исключений ( Ctrl-Alt-E ). 1

Чтобы избежать многих ложных (обработанных) исключений, я обычно стараюсь приблизиться к точке, в которой будет запускаться инициализатор, и затем проверяю этот флажок перед продолжением.

Также, если есть исключения загрузчика, обязательно проверьте вложенные внутренние исключения или информацию о загрузчике в исключении: само исключение обычно не настолько информативно.Мне часто приходилось копаться в 2 или более слоях оберток исключений, чтобы понять фактическую ошибку.


1 Я могу только угадать какна почему то есть;Мне кажется, что инициализаторы статического типа не считаются детерминированными (многие вещи могут вызывать его, и порядок часто не определен; просто гарантируется, что статический конструктор типа будет запущен до того, как он будет использован , но он может использоваться практически в любой точке кода, без вашего ведома или явного вызова).

Следовательно, для среды выполнения будет трудно определить, было ли это'обрабатывается кодом пользователя' (ни один пользователь не должен ожидать его обработки, потому что он не знает - детерминистически - , когда запустится инициализатор).

Однако, это предположение с моей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...