2016-01-22 8 views
2

Вот странная проблема, с которой я сталкиваюсь с приложением Windows 8.1 XAML.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, то, похоже, нет сохранения приложения.

Что я могу сделать, чтобы убедиться, что приложение продолжает работать, когда это неудачное событие происходит и не вылетает на рабочий стол?

EDIT:

Для справки, это сообщение об ошибке, которое происходит при использовании 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

Какое фактическое сообщение об ошибке? – Barptad

+0

@Barptad Я добавил сообщение об исключении для элементов управления DevExpress. Я не думаю, что это имеет значение ... – Shaamaan

+0

Можете ли вы уточнить свой вопрос? Вы боитесь, что обработчик событий из 'App.g.i.cs' будет запущен в версии выпуска на устройстве конечного пользователя? – Alex

ответ

0

Видимо установка e.Handled = true; делает не гарантии того, что приложение не будет врезаться (как описано on MSDN):

среды выполнения Windows рассматривает исключения, возникающие во время некоторых операций как невосстановимый, потому что сама Windows, время выполнения будет следует за непоследовательным состоянием, следуя этим исключениям.Для таких исключений , даже если обработчик событий UnhandledException устанавливает значение «Обработка» в true, приложение все равно будет прекращено.

Однако причина, по которой DevExpress вызывает такое недопустимое состояние с его контролем, является для меня загадкой ... Но по крайней мере это решает вопрос о том, почему приложение закрывается, несмотря на то, что событие обрабатывается.

Дополнительная благодарность людям из команды поддержки DevExpress, которые помогли в этом деле.

 Смежные вопросы

  • Нет связанных вопросов^_^