2015-07-30 3 views
1

Я создаю надстройку для Solidworks EPDM (example from API help). Это проект библиотеки классов (DLL), который добавляется в EPDM и позволяет добавлять в программу некоторые пользовательские функции.Как регистрировать необработанные исключения в проекте библиотеки классов vb.net?

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

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

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

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

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

enter image description here

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

+1

В этом сценарии нет необработанных исключений, программа-хозяин получит их. Он обязательно отобразит * что-то *, но редко будет достаточно хорошим, чтобы помочь вам диагностировать сбой. Поместите Try/Catch в свой метод DoCmd(), не забудьте бросить его снова, чтобы хозяин знал, что это пошло не так. –

+0

@HansPassant - так что вы рекомендуете попробовать catch с общим «catch ex as exception», запишите его и повторно бросите? – CBRF23

+1

«Лучшая» практика должна заключаться в том, чтобы ваш код знал о * любом * исключении, которое может произойти внутри него; либо обрабатывать ее внутри вашей надстройки, если она может/должна, или документировать ее, чтобы вызывающий код мог ее обработать, если нет. Наличие глобального «try-catch» может помочь на этапах разработки и тестирования, но не для реальных сценариев; как только вы получите все исключения, которые могут произойти, вы должны избавиться от него. –

ответ

2

Это очень простой пример, но оберните свой код с помощью 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 о вновь бросает исключение, но я вообще обнаружил, что проблематично с ЭПДМИ надстройками, как это может привести к COM хоста к сбою.

+0

Это, по сути, то, что я делал, хотя я повторно бросаю любые исключения, которые я не знаю, как обращаться. Я полагаю, что я предпочел бы снести EPDM, а затем перевести его в неизвестное состояние. – CBRF23

+0

IMO, я бы просто обработал любое исключение. Кроме того, помните, что EPDM будет генерировать COMExceptions по дизайну для определенных методов API, если/когда вызов не выполняется по некоторым, по-видимому, доброкачественным причинам, так что следите за этими ошибками в документации. В таких случаях обычно завершение вызова метода с помощью дополнительного «try/catch (COMException ex) ...» заслуживает того, чтобы вы могли обрабатывать ожидаемый HRESULT (значение коррелирует с сообщением об ошибке EPDM в противном случае было бы показано как «File format boy признано. ») – blins

+0

Итак, теперь я сейчас в основном регистрирую и глотаю что-то не смертельное и неожиданное. Но исключения, такие как 'StackOverflowException',' OutOfMemoryException' и т. Д. Я использую 'Throw()' для возврата к EPDM, поскольку они довольно достоверно смертельны;) – CBRF23

Смежные вопросы