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

WinUI 3(Windows App SDK)全局异常处理方案咨询

WinUI 3 全局异常处理方案

WinUI 3(Windows App SDK)提供了多套全局异常处理机制,对应不同场景的未捕获异常:

1. UI线程未处理异常

WinUI 3的Microsoft.UI.Xaml.Application类提供了UnhandledException事件,作用和WinForms的Application.ThreadException类似,专门捕获UI线程中未被处理的异常。

在App.xaml.cs中注册并处理:

public App()
{
    this.InitializeComponent();
    // 注册UI线程异常处理事件
    this.UnhandledException += App_UnhandledException;
}

private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e)
{
    // 添加自定义处理逻辑,比如记录日志、弹窗提示用户
    // 标记异常为已处理,避免应用直接崩溃
    e.Handled = true;
}

2. 非UI线程未捕获异常

对于后台线程(如Task、独立Thread)中未被处理的异常,需要通过以下两个事件捕获:

(1)AppDomain全局异常

捕获当前AppDomain内所有未被处理的异常(包含后台线程),但触发后应用通常会终止,无法通过代码阻止:

public App()
{
    this.InitializeComponent();
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    var exception = e.ExceptionObject as Exception;
    // 记录异常信息,比如写入本地日志文件
}

(2)未观察到的Task异常

捕获Task中未被await、也未手动处理的异常:

public App()
{
    this.InitializeComponent();
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}

private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    // 遍历处理所有未观察到的异常
    foreach (var ex in e.Exception.InnerExceptions)
    {
        // 日志记录逻辑
    }
    // 标记异常为已观察,避免应用因未处理Task异常终止
    e.SetObserved();
}

注意事项

  • UnhandledException仅覆盖UI线程异常,后台线程异常需结合AppDomain.CurrentDomain.UnhandledException和TaskScheduler.UnobservedTaskException使用。
  • 部分致命系统异常无法通过上述事件捕获,最终仍会导致应用崩溃,建议处理时重点记录异常堆栈信息,便于后续问题排查。

内容的提问来源于stack exchange,提问作者E. A. Bagby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:23:23