尽管处理错误,Windows 8.1 XAML应用程序崩溃

时间:2016-01-22 11:38:28

标签: c# xaml winrt-xaml windows-rt

这是我在使用Windows 8.1 XAML应用程序时遇到的一个奇怪问题。

尽管我实现了异常处理,但DevExpress控件中的错误会导致整个应用程序崩溃。 DevExpress开发人员已经复制了这个特定的bug并正在开发一个解决方案 - 这个问题是关于崩溃的,尽管有错误处理,而不是DevExpress错误。

这次崩溃的独特之处在于它在App.g.i.cs中自动生成的代码中打破了这一行(与其他地方抛出的其他异常相反):

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
            UnhandledException += (sender, e) =>
            {
                if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
            };
#endif

似乎这是在XAML相关机制中发生某种异常/崩溃时触发的(但这只是我个人的猜测)...我不认为上面的代码是造成“崩溃”的原因到桌面“效果,但它似乎确实是一种症状。

我自己的错误处理代码(在App.xaml.cs中):

public App()
{
  //...
  this.UnhandledException += App_UnhandledException;
  //...
}

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    var ex = e.Exception;
    e.Handled = true;
    Logger.LoggingError(ex);
        await Controls.MessageDialog.Show(ex.Message, Controls.MessageDialog.DialogType.Error, Controls.MessageDialog.DialogButtons.Retry, ElementTheme.Light);
    var frame = Window.Current.Content as Frame;
    frame.Navigate(typeof(Views.SplashLoading));
}

错误处理尝试:

  1. 记录错误
  2. 显示错误
  3. 返回开始视图
  4. 再次 - 这通常适用于所有其他目的。但是,如果App.g.i.cs中的断点被触发(或者会被触发,如果应用程序在客户端计算机上被释放),那么我的错误处理将完全失败。

    请注意,这不是DevExpress控件独有的。只是DevExpress控件以可复制的方式导致此行为。再次 - 如果异常会导致App.g.i.cs中的代码被触发,那么似乎没有保存应用程序。

    如果这个不幸的事件发生并且没有崩溃到桌面,我该怎么做才能确保应用程序继续运行?

    编辑:

    作为参考,这是使用DevExpress控件时出现的错误消息:

    System.ArgumentException: The parameter is incorrect.
    
    The value cannot be infinite or Not a Number (NaN).
       at Windows.UI.Xaml.Controls.ScrollViewer.ChangeView(Nullable`1 horizontalOffset, Nullable`1 verticalOffset, Nullable`1 zoomFactor, Boolean disableAnimation)
       at DevExpress.Core.Native.DXVirtualizingPanel.ScrollElementIntoView(Double elementOffset, Double rowHeight)
       at DevExpress.Core.Native.DXVirtualizingPanel.ScrollIntoView(Int32 visibleIndex)
       at DevExpress.UI.Xaml.Grid.DataControlBas
    

    不幸的是,这是完整的消息 - 似乎缺少完整的堆栈跟踪。

1 个答案:

答案 0 :(得分:0)

显然设置e.Handled = true; 保证应用程序不会崩溃(如on MSDN所述):

  

Windows运行时会考虑在某些情况下遇到的异常   操作为不可恢复,因为Windows运行时本身会   在这些例外之后处于不一致状态。对于这样   异常,即使UnhandledException事件处理程序设置Handled   如果真的,该应用程序仍将被终止。

然而,为什么DevExpress导致这种无效状态的控制对我来说是一个谜......但至少它解决了为什么应用程序在事件被处理后关闭的问题。

特别感谢DevExpress支持团队的帮助,他们为此案提供了帮助。