我有一个通用的WinRT应用程序,我正在尝试实现全局异常处理,以便可以提示用户向我发送带有额外诊断信息的报告。(额外的诊断信息是为什么我不能使用内置处理程序记录到Dev Portal的原因)。
我有以下代码:
当我在我的初始XAML页面(我的登录页面)中强制抛出异常时,例如硬编码
我有以下代码:
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_OUTPUT
和DISABLE_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();
}