如何将未处理的异常传递给线程中的应用程序catch块

时间:2015-06-24 22:16:16

标签: c# multithreading unhandled-exception activexobject

我目前有一个应用程序可以打开一个向用户显示信息的ActiveX对象。 COM对象需要在新线程中才能成为模态。目前我遇到了一些问题:

  1. 我使用了一个用于显示ActiveX对象的base.Show()方法,它在运行时抛出一个InvalidOperationException,它通过VisualStudio通过抛出公共语言运行时异常来显示。
  2. 在尝试处理此异常时,它被封装在try / catch块中,但永远不会被catch捕获。因为它未处理,我试图使用在SO上的多个帖子中建议的Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)。
  3. 一旦命中了base.Show(),就会出现一个对话框,如果继续通过它,程序就会毫无问题地运行。
  4. 可能有以下几种解决方案:

    1. 禁用显示异常未处理的对话框。
    2. 抛出异常时,请记录它,但仍然允许执行base.Show()。
    3. 打开一个没有base.Show()的窗口,允许ActiveX控件显示。
    4. Show方法的代码如下:

      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之前打开窗口。

      提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

要解决此问题,我可以更改:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

这解决了这个问题。