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实例被垃圾回收时,才会触发。测试步骤如下:
- 创建一个会抛出异常但不被观察的Task:
// 注意:不要await这个Task,也不要保存它的引用后访问Exception Task.Run(() => { throw new IOException("测试未观察到的Task异常"); });
- 强制触发垃圾回收,让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
相关产品推荐
相关产品推荐

