我的应用程序是由父 WPF 应用程序动态加载的程序集。我处理来自组件的 AppDomain.UnhandledException 以处理从任何后台线程抛出的异常。
然而,似乎由于父应用程序也注册了相同的事件,未处理的异常也被传播到父应用程序。
是否有任何方法可以防止未处理的异常不传播到我的父应用程序。
我将无法更改父应用程序的行为,因为这可能会影响在父应用程序内运行的其他组件。
谢谢
我的应用程序是由父 WPF 应用程序动态加载的程序集。我处理来自组件的 AppDomain.UnhandledException 以处理从任何后台线程抛出的异常。
然而,似乎由于父应用程序也注册了相同的事件,未处理的异常也被传播到父应用程序。
是否有任何方法可以防止未处理的异常不传播到我的父应用程序。
我将无法更改父应用程序的行为,因为这可能会影响在父应用程序内运行的其他组件。
谢谢
只需阅读 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
}
这将确保异常不会传播到父应用程序
像这样给出事件处理程序的显式名称
您的命名空间是 MyCompany.MyProduct.Service 您父的命名空间是 MyCompany.MyProduct.Parent
而不是使用
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException(Myhandler);
使用以下
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException(MyCompany.MyProduct.Service.MyHandler);
我希望问题能得到解决。