在通用WinRT应用程序中,AppBarButton异常未触发未处理的异常事件。

5
我有一个通用的WinRT应用程序,我正在尝试实现全局异常处理,以便可以提示用户向我发送带有额外诊断信息的报告。(额外的诊断信息是为什么我不能使用内置处理程序记录到Dev Portal的原因)。
我有以下代码:
public App() {
    InitializeComponent();
    UnhandledException += OnUnhandledException;
    // other stuff
}

private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) {
    try {
        //handler
    }
    catch { }
    throw e.Exception;
}

当我在我的初始XAML页面(我的登录页面)中强制抛出异常时,例如硬编码
throw new FileNotFoundException();

如果我在我的起始页导航到主要的中心页面后执行此操作,那么我的处理程序将如预期般触发。然而,如果我在我的主要中心页面中执行此操作,则似乎我的处理程序不会运行。我可以在调试器中看到异常被抛出,但它只是在某个地方被吞噬了。我找不到它在哪里。我应该提到的是,此时应用程序仍然可以继续正常运行 - 它不会崩溃。

我在我的项目属性中设置了DISABLE_XAML_GENERATED_BINDING_DEBUG_OUTPUTDISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION以禁用内置的覆盖,据我所知这里没有async void的情况(例如未处理异常处理程序不适用于Metro/WinRT UI async void事件处理程序 - 尽管根据我所读的,这种问题在8.1中已经解决)。但可能有一些我没有看到的隐藏的async void问题。

我确定我错过了一些愚蠢的东西。是什么?

(编辑)看起来这是一个问题,当异常在AppBarButton按钮事件中特别出现时。

(编辑2)一个相对较小的重现在这里:http://1drv.ms/1rSNq3i - 在8.1模拟器或8.1手机上运行此代码, 点击按钮, 打开命令栏, 选择sign out - 这应该触发异常和处理程序,但是异常被丢失了。如果将代码移动到同一页的按钮中(标准按钮),则处理程序会触发。

(编辑3)我尝试以最小的方式使用调度程序,但并没有改变可见的结果:

private void SignOutAppBarButton_Click(object sender, RoutedEventArgs e) {
    Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
        throw new FileNotFoundException();
    }).AsTask().Wait();
}

你能分享一个小的可复现项目吗?这个问题在手机和电脑上都存在吗? - Filip Skakun
我还没有写PC版本。我会尝试在一个干净的项目中重现。 - MikeBaz - MSFT
一些异常是本机异常,不会被托管代码捕获。很遗憾,您无法处理这些异常。如果您已经连接了一个托管调试器,它们甚至会使其崩溃。 - Nate Diamond
即使是像我列出的那样的受控FileNotFoundException(),它在按钮中有效,但在CommandBar中的AppBarButton中却无效 :( - MikeBaz - MSFT
如果这个问题只出现在应用栏按钮上,也许你可以尝试在调度程序上运行点击处理代码。 - Filip Skakun
@FilipSkakun 谢谢您的建议 - 似乎没有帮助。我在问题描述中添加了详细信息。 - MikeBaz - MSFT
1个回答

0
除了需要处理 UnhandledException 事件外,您还需要处理 Frame.NavigationFailed。在页面构造函数中发生异常会导致触发 NavigationFailed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接