这是我在使用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));
}
错误处理尝试:
再次 - 这通常适用于所有其他目的。但是,如果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
不幸的是,这是完整的消息 - 似乎缺少完整的堆栈跟踪。
答案 0 :(得分:0)
显然设置e.Handled = true;
不保证应用程序不会崩溃(如on MSDN所述):
Windows运行时会考虑在某些情况下遇到的异常 操作为不可恢复,因为Windows运行时本身会 在这些例外之后处于不一致状态。对于这样 异常,即使UnhandledException事件处理程序设置Handled 如果真的,该应用程序仍将被终止。
然而,为什么DevExpress导致这种无效状态的控制对我来说是一个谜......但至少它解决了为什么应用程序在事件被处理后关闭的问题。
特别感谢DevExpress支持团队的帮助,他们为此案提供了帮助。