В настоящее время у меня есть приложение, которое открывает объект ActiveX, который отображает информацию пользователю. COM-объект должен быть в новом потоке, чтобы быть модальным. Есть в настоящее время несколько вопросов, которые я имею с ним:Как передать необработанное исключение в блок catch приложения в потоке
- Я использую метод base.Show(), который используется для отображения объекта ActiveX, и он бросает InvalidOperationException во время выполнения, который показан через VisualStudio по выбрасывание исключений для обычного языка Runtime.
- В попытке справиться с этим исключением он инкапсулируется в блок try/catch, но никогда не попадает в catch. Поскольку он необработан, я попытался использовать Application.SetUnhandledExceptionMode (UnhandledExceptionMode.CatchException), который был предложен в нескольких сообщениях на SO.
- После нажатия кнопки base.Show() появляется диалоговое окно, и если продолжить его, программа запускается без проблем.
Несколько решений могут быть:
- Отключить диалоговое окно, которое показывает, что исключение необработанное.
- Когда выбрано исключение, запишите его, но все же разрешите выполнить base.Show().
- Откройте окно без base.Show(), которое позволит элементу управления ActiveX отобразить.
Код для шоу метода заключается в следующем:
public void Show(string url, int entityId, string sessionId, int projId, string docId)
{
try
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
base.Show(); //exception occurs here
}
catch (Exception ex)
{
//continue without dialog because once continuing in the dialog, application runs without error
Logger.Error("Base.Show() throws InvalidOperationException, but continuing will bypass issue", ex);
}
try
{
this.DocViewer.InitComm(url, entityId, sessionId, projId, docId);
}
catch (Exception ex)
{
Logger.Error("Error opening papervision viewer", ex);
throw;
}
}
Я не уверен, как этот метод в основном потоке, и попытались использовать BeginInvoke, но base.Show() должен откройте окно перед запуском DocViewer.InitComm.
Заранее благодарим за любую помощь!
Невозможно, чтобы ваш вызов 'base.Show()' выдавал исключение, и все же это исключение не было бы захвачено 'try/catch', которое окружает вызов. Предоставьте [хороший, _minimal_, _complete_ пример кода] (https://stackoverflow.com/help/mcve), который надежно воспроизводит проблему. –