Я пытаюсь реализовать правильную обработку исключений в моем приложении для монодидов, которое написано с помощью плагина Xamarin.Android для Visual Studio.
Я пытаюсь обрабатывать 2 типа исключений:
- на переднем плане (UI)
- в фоновом режиме (threadpool)
В обоих случаях в глобальном обработчике я хочу:
- Ведение журнала - (отправка события аналитики)
- Уведомление пользователя - (предупреждение)
После определенного расследования я нашел несколько ответов здесь, здесь и здесь, но ничего, кроме AndroidEnvironment.UnhandledExceptionRaiser и AppDomain.UnhandledException, было предложено, и оно не работает во всех случаях.
Я создал короткий образец, где я пытаюсь использовать оба обработчика:
AppDomain.CurrentDomain.UnhandledException += (s,e)=>
{
System.Diagnostics.Debug.WriteLine("AppDomain.CurrentDomain.UnhandledException: {0}. IsTerminating: {1}", e.ExceptionObject, e.IsTerminating);
};
AndroidEnvironment.UnhandledExceptionRaiser += (s, e) =>
{
System.Diagnostics.Debug.WriteLine("AndroidEnvironment.UnhandledExceptionRaiser: {0}. IsTerminating: {1}", e.Exception, e.Handled);
e.Handled = true;
};
И затем при нажатии кнопки я добавил следующий код для повышения обоих типов исключений:
//foreground exception
throw new NullReferenceException("test nre from ui thread.");
//background exception
ThreadPool.QueueUserWorkItem(unused =>
{
throw new NullReferenceException("test nre from back thread.");
});
В результате у меня другое поведение для обоих типов исключений:
- на первый план:
- оба обработчика подняты
- невозможно запретить приложение разбился - он будет разбит любым способом (e.Handled = true просто игнорируется)
- фон:
- создается только второй обработчик
- приложение не сбой
В моем случае я не мог обернуть каждое действие пользователя в try-catch, особенно фоновые задачи. У меня есть бизнес-логин, который следует прервать в случае ошибки, и это именно то, чего я ожидаю от времени выполнения. В то же время я хочу обработать это исключение на верхнем уровне в одном месте, зарегистрировать их (на основе моих бизнес-правил) и продолжить выполнение приложения.
Как обрабатывать оба исключения и по-прежнему иметь возможность сохранять приложение в активном режиме (предотвращать сбой).
Здесь вы можете найти полный пример кода: https://dl.dropboxusercontent.com/u/19503836/UnhandledException.zip
Спасибо за ваш совет. Любая помощь оценивается. ТИА!