Извиняюсь за поздний ответ - занятая неделя!
Вся идея перехвата исключений состоит не в том, чтобы «проглотить» их и отобразить сообщение об ошибке, а в том, чтобы восстановить, если возможно, ситуацию, а также очистить ресурсы.
Да, это идея, но на практике это не всегда получается так чисто. Данный код по сути является посредником и часто не может знать, произойдет ли ошибка, и если она произойдет, он не может знать, что пользователь на самом деле пытается сделать, и, таким образом, автоматически восстанавливается.
Всегда ли это происходит?
Да, если это непредвиденное исключение и оно всегда отображается как .NET, происходящее из кода C # /. NET
создать простой метод, который просто генерирует исключение (throw new ApplicationException ();) и проверяет, не возникла ли у вас проблема?
Нет, выбрасывание наших собственных исключений прекрасно работает каждый раз. Только если сама среда выполнения генерирует исключение, мы получаем серьезные сбои.
вы не выпускаете COM-объекты MS Excel, которые вы неявно создаете при возникновении исключения
Это звучит правдоподобно. Слой VBA передает данные из Excel через COM и в .NET, поэтому он вполне может делать что-то необычное с владением ресурсами.
Если вы хотите централизованное ведение журнала, посмотрите вместо этого Application.ThreadException (для приложения WinForms) и AppDomain.CurrentDomain.UnhandledException.
Я не заглядывал в первое, но второе никогда бы не вызвали. Одной из моих первых попыток было поймать его на уровне AppDomain, предполагая, что по какой-то причине исключение на основе делегата проскальзывало по сети.
вы можете позвонить маршалу. ReleaseComObject ()
Интересно, я не знал об этой функции. Мы в основном игнорировали любой явный COM-код и ушли с самого минимума и надеемся (!), Что .NET CLR делает свое волшебство ...
Я обошел это сейчас, удалив делегатов, и все кажется счастливым. Просто нужно помнить, чтобы быть осторожными (или полностью избегать) делегатов и исключений в будущем Office + VBA + COM + CLR код: -)