我有一个通用WinRT应用程序,我正在尝试实现全局异常处理,因此我可以提示用户向我发送一份报告,其中包含我收集的额外诊断信息。 (额外的诊断信息是我无法使用将登录到Dev Portal的内置处理程序的原因。)
我有以下代码:
public App() {
InitializeComponent();
UnhandledException += OnUnhandledException;
// other stuff
}
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) {
try {
//handler
}
catch { }
throw e.Exception;
}
当我在我的初始XAML页面(我的登录页面)强制异常时,e。 G。硬编码
throw new FileNotFoundException();
然后按预期触发我的处理程序。但是,如果我在我的主页面页面中执行此操作,我的起始页面导航到该页面,那么看起来我的处理程序不会运行。我可以看到调试器中抛出了异常,但它只是被某个地方吞噬了。我找不到哪里。我应该提一下,应用程序在这一点上继续愉快 - 它不会崩溃。
我已在DISABLE_XAML_GENERATED_BINDING_DEBUG_OUTPUT
中设置DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
和Project Properties
以禁用内置覆盖,据我所知,这里没有async void
情况(例如Unhandled exception handler not called for Metro / WinRT UI async void event handler - 尽管从我所读过的内容来看,这种问题在任何情况下都会在8.1中得到解决)。但是我可能还没有看到某种隐藏的异步无效事物。
我确定我错过了一些愚蠢的东西。它是什么?
(编辑)当异常处于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();
}
答案 0 :(得分:0)
除UnhandledException
事件外,您还需要处理Frame.NavigationFailed
。页面构造函数中的异常导致触发NavigationFailed
。