Обработка глобального исключения Xamarin | Дроид | IOS

Мы все знаем, что мобильная платформа - это компактная платформа, где нам приходится много искать при создании приложения. Это может быть что угодно, например, Memory Performance Resolutions Architecture Implementation и т.д. Мы никогда не знаем, когда и что вызывает приложение аварии большой проблемой во время игры с приложением, это может произойти в любое время

например, запуск приложения, экран загрузки, вызов API, привязка данных, загрузка изображений и т.д.

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

  1. Ошибка приложения при запуске.
  2. Ошибка загрузки приложения при загрузке экрана Splash.
  3. Ошибка приложения при показе изображения.
  4. Приложение сбой при привязке данных из api.

Как определить проблему и где она возникает?

Ответ 1

Цель: Наша цель здесь, чтобы собрать данные трассировки стека исключений, которые помогают нам определить, что именно вызывает проблему, в Release Mode или Debug Mode. Мы сможем понять проблему и причину ее возникновения. Мы сохраним эти данные в text файле, который будет храниться в памяти устройства.


Решение. В качестве альтернативы вы можете сделать свой собственный анализатор захвата, который даст вам представление о приложениях и подскажет, если что-то пошло не так во время тестирования приложения. Его будет вашим, вы можете настроить, как хотите. пусть погрузится, чтобы try{} и catch{} глобально.

Создайте файл Helper Class котором есть метод для создания текстового файла для данных исключения.

public static class ExceptionFileWriter
{
    #region Property File Path

    static string FilePath
    {
        get
        {
            string path = string.Empty;
            var _fileName = "Fatal.txt";
#if __IOS__
            string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // Documents folder C:\ddddd
            string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder C:\dddd\...\library
            path = Path.Combine(libraryPath, _fileName); //c:\ddddd\...\library\NBCCSeva.db3
#else
#if __ANDROID__
            string dir = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.ToString(), "Exception");
        if (Directory.Exists(dir))
            return Path.Combine(dir, _fileName);
        path= Path.Combine(Directory.CreateDirectory(dir).FullName, _fileName);
#endif
#endif
            return path;
        }
    }

    #endregion

    #region ToLog Exception

    public static void ToLogUnhandledException(this Exception exception)
    {
        try
        {
            var errorMessage = String.Format("Time: {0}\r\nError: Unhandled Exception\r\n{1}\n\n", DateTime.Now, string.IsNullOrEmpty(exception.StackTrace) ? exception.ToString() : exception.StackTrace);
            File.WriteAllText(FilePath, errorMessage);
        }
        catch (Exception ex)
        {
            // just suppress any error logging exceptions
        }
    }

    #endregion
}

Время для реализации кода: Подписывайте следующие события внутри вашего приложения. Файл Application или Splash Activity. В этом случае я использую приложение.

AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;

[Application]
public class ExceptionHandlingApp : Application
{
    #region Constructor

    public ExceptionHandlingApp(IntPtr javaReference, JniHandleOwnership transfer)
        : base(javaReference, transfer)
    {

    }

    #endregion

    #region OnCreate

    public override void OnCreate()
    {
        base.OnCreate();
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
        TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
    }

    #endregion

    #region Task Schedular Exception

    private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs)
    {
        var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception);
        newExc.ToLogUnhandledException();
    }

    #endregion

    #region Current Domain Exception

    private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
    {
        var newExc = new Exception("CurrentDomainOnUnhandledException", unhandledExceptionEventArgs.ExceptionObject as Exception);
        newExc.ToLogUnhandledException();
    }

    #endregion
}

Примечание. Файл записей исключений можно найти в Device Storage | Диспетчер файлов> Исключительная папка> fatal.txt

Ура !!

Результат Видео

Полная статья

Ответ 2

Помимо того, что вы делаете это самостоятельно, вы также можете использовать Xamarin.Insights, поскольку он может свободно использоваться для пользователей Xamarin и имеет реализации для всех платформ. Вы получаете отчеты об использовании, отчеты о сбоях и т.д. В Интернете без необходимости отправки пользователем файла журнала вручную.

Единственное, что вам нужно сделать, чтобы получать отчеты о сбоях - это инициализировать Xamarin.Insights при запуске вашего приложения:

Insights.HasPendingCrashReport += (sender, isStartupCrash) =>
{
  if (isStartupCrash) {
    Insights.PurgePendingCrashReports().Wait();
  }
};
Insights.Initialize("Your API Key");