2012-08-09 2 views
1

Я пытаюсь обрабатывать исключения в диалоговом окне, чтобы при возникновении какого-либо исключения диалог закрывался и приложение не выпадало бы из строя. Как вы можете видеть, я использую простой примерку поймать блок:Ошибка в CanExecute() - как избавиться от диалога?

IDialogView dialog = null; 
try 
{ 
    if (_dialogViewModel == null) 
    { 
     dialog = ViewFactory.SomeDialog(); 
     _dialogViewModel = new DialogViewModel(dialog); 
     _dialogViewModel.LoadData(); 
    } 
    _dialogViewModel.ShowDialog(); 
} 
catch (Exception ex) 
{ 
    if (dialog != null) 
     dialog.Close(); 
    _dialogViewModel = null; 
    MessageBox.Show("Sorry, there was an error in the dialog.", "Error", 
        MessageBoxButton.OK, MessageBoxImage.Error); 
    return; 
} 

Проблема происходит, когда возникает ошибка в обработчике события CanExecute() кнопки. Ошибка успешно поймана, но когда я показываю пользователю MessageBox, CanExecute() выполняет снова, и поэтому ошибка повторяется снова. В итоге это приводит к сбою приложения.

У меня есть информация о googled, и, как говорили, убедитесь, что в обработчике событий CanExecute() нет исключений. Но что-то подобное может произойти где-то в другом месте, и именно поэтому я хочу просто перехватить ВСЕ исключения в точке входа в диалог, не работая с каждым методом.

Итак, мой вопрос: как разрушить диалог, чтобы после исключения catch он больше не будет отображаться? Close() не работал, потому что перед закрытием все еще звонки CanExecute().

+0

Что такое ошибка, которая происходит в 'CanExecute'? Возможно, это должно быть исправлено? –

+0

Вы можете попробовать отключить события на кнопке, т. Е. Удалить обработчик события Button.Click(). – Steztric

+0

Да, я прочитал предложение исправить ошибку или удалить обработчик. Но таким образом каждая ошибка может быть исправлена ​​или устранена по-своему, но проблема в том, что сначала необходимо найти ошибку. Ошибка будет исправлена, но я хочу, чтобы мое приложение не вылетало в следующий раз, когда произошло какое-то пропущенное исключение. – STiLeTT

ответ

1

Как вы обнаружили, когда вы googled, вы должны убедиться, что обработчик CanExecute a) легкий и b) никогда не выдает исключение. Вы столкнулись с основной причиной этого: CanExecute будет запущен повторно и автоматически, с помощью фреймворка. Он будет работать при изменении фокуса, при вводе событий, при изменении привязки данных и в ответ на ряд других причин, по которым вы почти не контролируете.

Проблема: вы сделать есть ошибка, и что ошибка происходит неоднократно. Это означает, что вы можете выбирать между сбоями или несколько раз показывать диалог. Или вы можете что-то сделать с ошибкой.

Ваш ответ: исправить ошибку.

(Обработчик как он стоит отлично подходит для других ваших ошибок. Оставьте его там. Но эта конкретная ошибка, вам нужно исправить сразу.)

+0

Очевидно, что я должен исправить ошибку. Но есть ли способ избавиться от ВСЕХ ошибок? Потому что, если я буду замечать ошибки в 'CanExecute', я все еще не могу быть уверен, что таких ситуаций больше не будет. Есть ли что-то, что я должен знать? – STiLeTT

+0

Что вы подразумеваете под словом «избавиться от всех ошибок?» Вы можете * исправить ошибки * - что хорошо - или вы можете игнорировать ошибки - что плохо - или вы можете разрешить ошибки сбой приложения - по умолчанию, и в целом это нормально для ошибок, которые вы не ожидаете увидеть (например, «вне памяти»). Каждая ошибка, которую вы слепо игнорируете, делает ваше приложение более неустойчивым. –

+0

Я имею в виду все ошибки внутри диалогового окна, как этот, так что только диалог будет разбиваться, а не целое приложение. Ошибки не будут слепо проигнорированы, после этого они будут исправлены, потому что мы получаем журналы ошибок. – STiLeTT

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

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