【问题标题】:Handling exceptions from background thread of a component loaded dynamically from WPF application处理从 WPF 应用程序动态加载的组件的后台线程异常
【发布时间】:2012-05-12 01:17:17
【问题描述】:

我的应用程序是由父 WPF 应用程序动态加载的程序集。我处理来自组件的 AppDomain.UnhandledException 以处理从任何后台线程抛出的异常。

然而,由于父应用程序也注册了相同的事件,未处理的异常似乎也传播到了父应用程序。

是否有任何方法可以防止未处理的异常不传播到我的父应用程序。

我将无法更改父应用程序的行为,因为这可能会影响在父应用程序内运行的其他组件。

谢谢

【问题讨论】:

  • 您是否正在使用 System.Exception 进行捕获?
  • Linquacious,AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) { if (e.IsTerminating) { ExceptionProcessor.HandleError(e.ExceptionObject as Exception, "发生未知错误。组件将被关闭", true, true); } else { ExceptionProcessor.HandleError(e.ExceptionObject as Exception, "发生未知错误。", true); } }
  • 为什么不在代码中创建不同的处理程序,这样父应用程序的处理程序就永远不会被调用!
  • Linquacious,我在上一条评论中发布的代码在我的组件中。父应用程序也有一个类似的事件处理程序。当发生异常时,两个处理程序都会被调用。

标签: c# wpf multithreading exception-handling unhandled-exception


【解决方案1】:

像这样给出事件处理程序的显式名称

您的命名空间是 MyCompany.MyProduct.Service 你父母的命名空间是 MyCompany.MyProduct.Parent

而不是使用

AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException(Myhandler);

使用关注

AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException(MyCompany.MyProduct.Service.MyHandler);

希望问题能解决。

【讨论】:

    【解决方案2】:

    只是阅读 MSDN 的文档,

    如果在默认应用程序域中处理 UnhandledException 事件,则无论线程在哪个应用程序域中启动,都会在任何线程中引发任何未处理的异常。如果线程在具有事件处理程序的应用程序域中启动对于 UnhandledException,该事件在该应用程序域中引发。如果该应用程序域不是默认应用程序域,并且默认应用程序域中还有一个事件处理程序,则在两个应用程序域中都会引发该事件。

    例如,假设一个线程在应用程序域“AD1”中启动,调用应用程序域“AD2”中的一个方法,然后从那里调用应用程序域“AD3”中的一个方法,并引发异常。可以引发 UnhandledException 事件的第一个应用程序域是“AD1”。如果该应用程序域不是默认应用程序域,则也可以在默认应用程序域中引发该事件。

    所以解决方案是为我的组件创建一个单独的域并为我的域创建事件处理程序

      AppDomain domain = AppDomain.CreateDomain("MyDomain");
    
      domain.UnhandledException += MyDomainUnhandledException
      static void CurrentDomainUnhandledException(objectsender,UnhandledExceptionEventArgs e) 
      {
       //Exception handling logic for my domain
      }
    

    这将确保异常不会传播到父应用程序

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 2011-02-09
      • 2011-03-04
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多