Обработка фатальных исключений в ViewModel/Model

У меня есть приложение, написанное с использованием подхода M-V-VM.

Доступ к данным осуществляется в модели. Если здесь возникает фатальная ошибка (например, соединение с источником данных теряется), и возникает исключение. Это исключение пузырится до ViewModel.

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

Я предпочел бы, чтобы это исключение оставалось необработанным, поэтому мой обработчик необработанных исключений в масштабе всего приложения мог его забрать, зарегистрировать и изящно выйти. Как я могу достичь этого?

Ответы

Ответ 1

Вы можете поставить очередь на срабатывание исключения на диспетчере.

    // This property is connected to the window using databinding
    public string ExceptionThrowingBoundedField
    {
        get
        {

            try
            {
                // This function might throw an exception
                return GetValueFromDatabase();               
            }
            catch (Exception ex)
            {
                ApplicationException exWrapper = new ApplicationException("Wrapped Exception",
                                                                          ex);
                Action throwException = () => { throw exWrapper; };
                Dispatcher.CurrentDispatcher.BeginInvoke(throwException);
                return "";
            }
        }
    }

Ответ 2

Недавно наткнулся на способ получения вокруг проблемы с проглатыванием исключений глобальным способом.

Создайте собственный класс привязки и переопределите UpdateSourceExceptionFilter - см. образец в этом потоке.

К сожалению, это просто WPF 4.0, а не SL 4.0.

Ответ 3

похоже, что аналогичный вопрос задавали раньше: текст ссылки