You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中如何抛出未处理异常以测试AppDomain及TaskScheduler的异常捕获逻辑

测试AppDomain未处理异常与未观察任务异常的方法

我来给你分享几个简单直接的测试方案,分别对应你实现的两种异常捕获逻辑,确保能触发对应的处理代码:

一、测试AppDomain.CurrentDomain.UnhandledException

这个事件会捕获任何线程中未被try-catch包裹的异常,你可以用以下两种方式测试:

1. 在主线程抛出未捕获异常

比如在某个用户交互事件(比如按钮点击)里写这段代码:

throw new InvalidOperationException("测试主线程未处理异常");

只要这个异常没有被外层的try-catch捕获,就会触发你注册的UnhandledException事件。

2. 在子线程抛出未捕获异常

如果想测试跨线程的情况,可以启动一个新线程并抛出异常:

new Thread(() => {
    throw new NullReferenceException("来自子线程的未处理异常");
}).Start();

这个线程内的异常没有被任何try-catch处理,最终会被AppDomain的全局异常捕获逻辑拦截。

二、测试TaskScheduler.UnobservedTaskException

这个事件的触发条件特殊:只有当Task抛出异常后,没有被await、没有被访问Exception属性,且Task实例被垃圾回收时,才会触发。测试步骤如下:

  1. 创建一个会抛出异常但不被观察的Task:
// 注意:不要await这个Task,也不要保存它的引用后访问Exception
Task.Run(() => {
    throw new IOException("测试未观察到的Task异常");
});
  1. 强制触发垃圾回收,让CLR检测到这个未被处理的Task异常:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect(); // 再次回收,确保Task实例被清理

执行完这两句GC代码后,你的UnobservedTaskException事件处理逻辑就会被触发。

测试注意事项

  • 在Debug模式下,Visual Studio默认会捕获所有CLR异常并打断点,你可以暂时关闭这个功能:打开Debug -> Windows -> Exception Settings,取消勾选Common Language Runtime Exceptions,这样就能看到你的自定义异常处理逻辑正常执行了。
  • 测试未观察Task异常时,确保没有其他代码持有这个Task的引用,否则GC不会回收它,也就不会触发事件。

内容的提问来源于stack exchange,提问作者MHGoose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:48:12