Остановка HockeyApp, вызывающего сбой моего приложения Xamarin iOS с помощью UnobservedTaskException

У нас есть приложение Xamarin для iOS, которое находится поверх асинхронной библиотеки PCL. Существует вероятность того, что иногда задача в библиотеке будет давать сбой и не будет наблюдаться. Поэтому мы подключили обработчик UnobservedTaskException к TaskScheduler, чтобы гарантировать, что это не обязательно приведет к остановке нашего приложения.

Это работало нормально, пока мы не включили HockeyApp для централизации отчетов о сбоях. Hockey добавляет собственный обработчик ненаблюдаемых исключений задач, который всегда завершает работу приложения после отправки отчета о сбое на его серверы. У меня нет проблем с тем, что они делают это для обработчика AppDomain UnhandledException, но мне нужно, чтобы они не убивали приложение из-за ненаблюдаемых исключений задачи.

Кажется, существует механизм установки пользовательского обработчика для этих исключений, но я не вижу, как его установить в Xamarin iOS Hockey SDK.

Вот код, который мы используем для включения Hockey

var manager = BITHockeyManager.SharedHockeyManager;

manager.Configure(APPID);
#if DEBUG
   manager.DebugLogEnabled = true;
#endif

manager.StartManager();

Кто-нибудь знает, как переопределить поведение HockeyApp по умолчанию для UnobservedTaskExceptions?


person Richard Blewett    schedule 15.10.2016    source источник


Ответы (3)


UnobservedTaskException EventHandler жестко запрограммирован в методе StartManager, и его нельзя удалить напрямую.

TaskScheduler.UnobservedTaskException += (sender, e) => ThrowExceptionAsNative(e.Exception);

Ссылка: https://github.com/bitstadium/HockeySDK-Xamarin/blob/28e67ecba14d00c8bea8043e08678af6044d33cf/source/HockeySDK.iOSBindings/Additions.cs#L43

Лично я строю из исходного кода, публично выставляю ThrowExceptionAsNative и добавляю методы конфигурации для включения/исключения обработчика по умолчанию при вызове StartManager. Это точно так же, как делает HockeyApp с HockeySDK-Windows API.

Таким образом, при перехвате UnobservedTaskException у вас есть возможность обработать его самостоятельно или создать его как собственное исключение.

Это очень похоже на исходные собственные привязки Xamarin, и я не понимаю, почему они сделали это так, как в коде HockeySDK-Windows, они удалили обработку по умолчанию UnobservedTaskException:

Начиная с .NET 4.5, по умолчанию UnobservedTaskExceptions больше не вызывают сбой приложения. SDK не был адаптирован для этого и по-прежнему регистрирует эти ошибки и вызывает выход из программы, хотя это может быть не нужно или не предназначено.

Пользователи, которые хотят продолжить использование обработчика, должны добавить вызовы RegisterUnobservedTaskExceptionHandler() или RegisterDefaultUnobservedTaskExceptionHandler() после вызова Configure().

Для пары клиентов, которым не нужна пользовательская сборка HockeySDK.Xamarin, я удаляю EventHandler с помощью отражения после вызова StartManager и добавляю наш пользовательский обработчик. Используя этот подход, у вас не будет публичного ThrowExceptionAsNative, доступного для создания исключения как собственного, если это необходимо, но это может сделать еще какое-то отражение: -/

person SushiHangover    schedule 15.10.2016
comment
Спасибо - это действительно полезно - person Richard Blewett; 15.10.2016
comment
Привет @SushiHangover, есть какие-нибудь подробности о том, как делать вызовы отражения? Вы предлагаете сделать что-то вроде установки TaskScheduler.UnobservedTaskException = null? (Обычно это мог сделать только сам класс) - person jonathanpeppers; 04.11.2016

Согласно этому вопросу поддержки, ответ - нет.

https://support.hockeyapp.net/discussions/problems/60521-hockeysdkuwp-413-no-way-to-disable-unobservedtaskexceptions

И этот коммит, похоже, пытается решить проблему

https://github.com/bitstadium/HockeySDK-Windows/commit/1c1bc9715e659dd1283b30dc5db

person Matthew Adams    schedule 15.10.2016
comment
Спасибо, Мэтью. Похоже, в прошлом могли быть способы сделать это github.com/bitstadium/HockeySDK-Windows/blob/, но это могло быть только для приложений магазина Win81. - person Richard Blewett; 15.10.2016
comment
@RichardBlewett HockeySDK-Windows != HockeySDK-Xamarin С помощью HockeySDK-Windows вы можете удалить обработчик через RegisterUnobservedTaskExceptionHandler, но в HockeySDK-Xamarin нет параллели. Смотрите мой ответ для более подробной информации - person SushiHangover; 15.10.2016

Я решил эту проблему с помощью этой строки кода:

var ex = t.Exception;

когда задача выдает исключение, я получаю результат

if ((t.IsFaulted) || (t.IsCanceled))
{
    var ex = t.Exception;
person Peter Bournakas    schedule 23.12.2016