贝利信息

Avalonia怎么实现一个全局异常处理器 Avalonia捕获未处理异常

日期:2026-01-17 00:00 / 作者:煙雲
在 Avalonia 中实现全局异常处理需三者配合:1. 注册 AppDomain.CurrentDomain.UnhandledException 捕获主线程崩溃异常;2. 订阅 TaskScheduler.UnobservedTaskException 处理未观察的 Task 异常;3. 重写 Application.OnUnhandledException(Avalonia 11+)捕获 UI 线程框架内未处理异常,三者覆盖绝大多数场景。

在 Avalonia 中实现全局异常处理器,核心是捕获应用主线程未处理的异常(如 UI 线程中抛出但未被 try/catch 捕获的异常),以及任务异步操作中未观察到的异常。Avalonia 本身基于 .NET 运行时,因此需结合 .NET 的异常捕获机制,并在 Avalonia 生命周期关键节点进行注册。

监听 AppDomain.CurrentDomai

n.UnhandledException

这是捕获非托管线程或部分同步上下文中未处理异常的兜底方式,适用于大多数崩溃性异常(如 NullReferenceException 在事件处理中直接抛出)。

订阅 TaskScheduler.UnobservedTaskException

用于捕获被丢弃(未 await、未 .Wait()、未 .Result)的 Task 中抛出的异常。这类异常默认会被静默吞掉,直到 GC 时触发此事件。

重写 Application.OnUnhandledException(Avalonia 11+ 推荐)

Avalonia 11 起提供了更贴近框架语义的入口:Application.OnUnhandledException,它会在 Avalonia 内部检测到 UI 线程未处理异常(如路由事件处理器、绑定转换器、控件生命周期方法中抛异常)时被调用。

可选:包装 Dispatcher.UIThread.Post/Invoke 操作

对于手动调度到 UI 线程的代码(如 Dispatcher.UIThread.InvokeAsync(() => { ... })),异常不会自动冒泡到全局处理器。可封装一层安全调用:

基本上就这些。三者配合使用(AppDomain + TaskScheduler + OnUnhandledException)可覆盖绝大多数未处理异常场景。不需要第三方库,纯 Avalonia + .NET 原生机制即可实现可靠捕获。