【问题标题】:Windows 8.1 XAML application crashes despite error handling尽管有错误处理,Windows 8.1 XAML 应用程序仍会崩溃
【发布时间】:2016-01-22 11:38:27
【问题描述】:

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

尽管我实现了异常处理,但 DevExpress 控件中的错误会导致整个应用程序崩溃。 DevExpress 开发人员已经复制了这个特定的错误并正在研究解决方案 - 这个问题是关于尽管有错误处理的崩溃,而不是关于 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. 返回开始视图

再说一遍 - 这通常适用于所有其他目的。但是,如果 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

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

【问题讨论】:

  • 实际的错误信息是什么?
  • @Barptad 我已将DevExpress 控件的异常消息添加到问题中。不过我觉得没关系……
  • 你能澄清你的问题吗?您是否担心来自App.g.i.cs 的事件处理程序会在最终用户设备上的发布版本中被触发?
  • @Alex 嗯,我希望我足够清楚。尽管我的错误处理代码,应用程序还是崩溃到桌面。我希望防止这种情况发生 - 我想显示一条错误消息并返回开始视图。崩溃似乎只发生在App.g.i.cs 中的代码被执行时——但我认为这是一个症状,而不是原因。
  • "再说一遍 - 这通常适用于所有其他目的。但如果 App.gics 中的断点被触发(或将被触发,如果应用程序在客户端计算机上发布)那么我的错误处理完全失败。”我问是因为你问题的这一部分。我无法理解。对不起。因此,您的错误处理效果很好,但仅在从App.g.i.cs 执行代码的情况下才有效。我说的对吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多