2015-06-24 1 views
1

В настоящее время у меня есть приложение, которое открывает объект ActiveX, который отображает информацию пользователю. COM-объект должен быть в новом потоке, чтобы быть модальным. Есть в настоящее время несколько вопросов, которые я имею с ним:Как передать необработанное исключение в блок catch приложения в потоке

  1. Я использую метод base.Show(), который используется для отображения объекта ActiveX, и он бросает InvalidOperationException во время выполнения, который показан через VisualStudio по выбрасывание исключений для обычного языка Runtime.
  2. В попытке справиться с этим исключением он инкапсулируется в блок try/catch, но никогда не попадает в catch. Поскольку он необработан, я попытался использовать Application.SetUnhandledExceptionMode (UnhandledExceptionMode.CatchException), который был предложен в нескольких сообщениях на SO.
  3. После нажатия кнопки base.Show() появляется диалоговое окно, и если продолжить его, программа запускается без проблем.

Несколько решений могут быть:

  1. Отключить диалоговое окно, которое показывает, что исключение необработанное.
  2. Когда выбрано исключение, запишите его, но все же разрешите выполнить base.Show().
  3. Откройте окно без 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.

Заранее благодарим за любую помощь!

+0

Невозможно, чтобы ваш вызов 'base.Show()' выдавал исключение, и все же это исключение не было бы захвачено 'try/catch', которое окружает вызов. Предоставьте [хороший, _minimal_, _complete_ пример кода] (https://stackoverflow.com/help/mcve), который надежно воспроизводит проблему. –

ответ

1

Чтобы устранить эту проблему, я был в состоянии изменить:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

в

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 

это решило проблему.