Я не могу поймать исключения в вызванном делегате - PullRequest
2 голосов
/ 05 августа 2011

У меня есть делегат, который прикреплен к событию в компоненте взаимодействия Excel. Цель состоит в том, чтобы обновить элемент управления winforms обновленной информацией из Excel. Поскольку я меняю свойства Control, мне нужно использовать Invoke:

public delegate void DataGridViewUpdate(object[,] data);

...

excel.InteractiveEdit( delegate(object[,] data) { 
    Invoke(new Common.DataGridViewUpdate(back_from_excel), new object[] { data }); 
});

...

private void back_from_excel(object[,] data) {
    // datagridview updating code
    // an exception is thrown here !
}

(Этот код находится в классе Form, который я обновляю, поэтому он вызывается на this)

В основном моя проблема заключается в том, что когда возникает исключение в методе back_from_excel(object[,] data), отладчик не перехватывает его. Я знаю, что делегат работает в правильном потоке пользовательского интерфейса, потому что у меня нет проблем с управлением элементами формы

В частности, случается, что когда back_from_excel попадает в необработанное исключение, оно прекращает выполнение в этот момент. Остальная часть приложения продолжает работать и реагирует. Отладчик не делает паузу . Панель вывода показывает:

A first chance exception of type 'System.NullReferenceException' occurred in My Application.exe
A first chance exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll

Он не дает никаких подсказок о том, какая строка вызвала проблему, просто она где-то в .exe.

У меня вопрос: правильно ли я делаю Invoke? Кажется странным, что делегат - Invoke - делегат объединяется таким образом, но мне нужно передать делегат, который вызывает делегата. Моя проблема в Visual Studio, а не в C #? Если да, то как мне снова подключить отладчик к этому потоку пользовательского интерфейса?

1 Ответ

2 голосов
/ 05 августа 2011

«Исключение первого шанса» означает, что исключение было сгенерировано, но в какой-то момент оно было обнаружено. Поскольку вы передаете делегат методу InteractiveEdit, этот метод может легко проглотить любые исключения, созданные делегатом.

По умолчанию Visual Studio будет перехватывать только те исключения, которые не были обнаружены. Если вы хотите перехватывать все исключения, независимо от того, перехвачены ли они, вам нужно настроить Visual Studio, чтобы она работала на всех исключениях. См. эту ссылку , чтобы узнать, как это сделать.

...