Как регистрировать необработанные исключения в проекте библиотеки классов vb.net?

Я создаю надстройку для Solidworks EPDM (пример из справки по API). Это проект библиотеки классов (.dll), который добавляется в EPDM и позволяет добавлять в программу некоторые пользовательские функции.

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

Я совершенно новичок во всем этом (и под всем этим я имею в виду VB.NET как язык, программирование чего-либо, кроме макросов в VBA, структурированной обработки исключений, регистрации ошибок и т. д.), и я пытаюсь следовать Инструкции MSDN: регистрация исключений в Visual Basic но инструкции по регистрации необработанных исключений не кажутся применимыми к проектам библиотеки классов.

В частности, я не знаю, как пройти шаг 3:

Чтобы зарегистрировать необработанное исключение
1. Выберите проект в Обозревателе решений. В меню Проект выберите Свойства.
2. Перейдите на вкладку Приложение.
3. Нажмите кнопку Просмотр Application Events, чтобы открыть редактор кода.
Откроется файл ApplicationEvents.vb.

Кнопка View Application Events недоступна для проектов библиотеки классов.

введите здесь описание изображения

Итак, есть ли другой способ добавить ведение журнала необработанных исключений в проекты библиотеки классов? Или другой способ получить доступ к файлу ApplicationEvents.vb для объектов библиотеки классов? Я пробовал искать и то, и другое, но пока не нашел решения, которое позволило бы мне регистрировать необработанные исключения.


person CBRF23    schedule 30.07.2015    source источник
comment
В этом сценарии нет необработанных исключений, их получит хост-программа. Он обязательно покажет что-то, но редко достаточно хорошее, чтобы помочь вам диагностировать сбой. Поместите Try/Catch в свой метод DoCmd(), не забудьте снова бросить его, чтобы хост знал, что что-то пошло не так.   -  person Hans Passant    schedule 30.07.2015
comment
@HansPassant - так вы рекомендуете попробовать поймать с помощью общего catch ex as exception, зарегистрировать его и повторно бросить?   -  person CBRF23    schedule 30.07.2015
comment
Лучше всего сообщать коду любое исключение, которое может произойти внутри него; либо обработать его внутри вашей надстройки, если он может/должен, либо задокументировать его, чтобы вызывающий код мог обработать его, если нет. Наличие глобального try - catch может помочь на этапах разработки и тестирования, но не для реальных сценариев; как только вы получите все исключения, которые могут произойти, вы должны избавиться от него.   -  person Josh Part    schedule 30.07.2015


Ответы (1)


Это очень простой пример, но оберните свой код с помощью Try/Catch только в два метода интерфейса («обратные вызовы хоста»), которые определяет IEdmAddIn5 и которые должен реализовать ваш класс надстройки.

Public Sub GetAddInInfo(ByRef poInfo As EdmAddInInfo, ByVal poVault As IEdmVault5, ByVal poCmdMgr As IEdmCmdMgr5) Implements IEdmAddIn5.GetAddInInfo
    Try
       ...
    Catch ex As Exception
       ' Handle exception...
    End Try
End Sub

Public Sub OnCmd(ByRef poCmd As EdmCmd, ByRef ppoData As System.Array) Implements IEdmAddIn5.OnCmd
    Try
       ...
    Catch ex As Exception
       ' Handle exception...
    End Try
End Sub

Обычно я согласен с @Hans Passant по поводу повторного создания исключения, но обычно я обнаружил, что это проблематично с надстройками EPDM, поскольку это может привести к сбою COM-хоста.

person blins    schedule 31.07.2015
comment
По сути, это то, что я в итоге сделал, хотя я повторно выбрасываю любые исключения, с которыми я не знаю, как обращаться. Я полагаю, что лучше разбить EPDM, чем перевести его в неизвестное состояние. - person CBRF23; 04.08.2015
comment
ИМО, я бы просто обработал любое исключение. Кроме того, помните, что EPDM будет генерировать исключения COMException для определенных методов API, если/когда вызов завершится ошибкой по определенным, казалось бы, безобидным причинам, поэтому следите за этими ошибками в документации. В таких случаях обычно рекомендуется оборачивать вызов метода дополнительным 'try/catch (COMException ex)...', чтобы вы могли обработать ожидаемый HRESULT (значение коррелирует с сообщением об ошибке, в противном случае EPDM будет отображаться как формат файла, распознанный мальчиком). .) - person blins; 04.08.2015
comment
Итак, где я сейчас нахожусь, в основном регистрирую и глотаю все, что не является фатальным и неожиданным. Но такие исключения, как StackOverflowException, OutOfMemoryException и т. д. Я использую Throw() для возврата к EPDM, так как они, несомненно, фатальны ;) - person CBRF23; 04.08.2015