捕获AppDomain中的异常并阻止其继续上抛

本文介绍了一种在独立AppDomain中捕获异常的方法,通过在新建的AppDomain中注册Application.ThreadException事件,并确保所有操作通过DoCallBack进行,实现了异常的有效捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近在做一个插件式客户端框架,系统要求UI插件要运行在一个独立的AppDomain中。不过这里遇到一个恶心的问题:在AppDomain中如何捕获异常。也许您会说使用Application.ThreadException或者Appdomain的UnhandledException事件啊,不过这两种方法我实验都是不成功。Application.ThreadException这个是不能跨domain的,对于独立AppDomain中异常无法捕获,而UnhandledException这个虽然能捕获到Exception但是无法阻止其继续上抛,也就是说用户还是会看到异常的提示。经过反复的实验和上网查找资料都没有找到解决方法,就在我丧失信心的时候雨痕老大出现了。其实解决思路还是Application.ThreadException不过使用方法有点特别,首先Application.ThreadException是不能跨域访问的因此需要在新建的domain中使用Application.ThreadException,其次是domain中跑的程序必须通过DoCallBack回调才行(不明白为什么非要这样)反正是解决了。有需要的朋友可以在这里看下demo。说明性代码如下:

  1.  private void button2_Click(object sender, EventArgs e)
  2.         {
  3.             AppDomain domain = AppDomain.CreateDomain("mydomain");
  4.             //回调方式
  5.             domain.DoCallBack(CallBack);
  6.         }
  7.         private static void CallBack()
  8.         {
  9.             Application.ThreadException += delegate(object sender, System.Threading.ThreadExceptionEventArgs e)
  10.             {
  11.                 MessageBox.Show(e.Exception.Message);
  12.             };        
  13.             //运行新实例    
  14.             Form2 form = new Form2();
  15.             form.Show();
  16.         }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值