ответ

16

Не существует способа «сделать Xamarin.Forms», который я знаю. Вам нужно подключиться к Android и iOS, что вы можете сделать, это создать один метод, который обрабатывает их обоих одинаково.

Хороший post об этом - Питер Норман. Он описывает, что для его реализации в Android вы можете сделать это в своем MainActivity.cs.

// In MainActivity 
protected override void OnCreate(Bundle bundle) 
{ 
    base.OnCreate(bundle); 

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

    Xamarin.Forms.Forms.Init(this, bundle); 
    DisplayCrashReport(); 

    var app = new App(); 
    LoadApplication(app); 
} 

‪#‎region‬ Error handling 
private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs) 
{ 
    var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception); 
    LogUnhandledException(newExc); 
} 

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

internal static void LogUnhandledException(Exception exception) 
{ 
    try 
    { 
     const string errorFileName = "Fatal.log"; 
     var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // iOS: Environment.SpecialFolder.Resources 
     var errorFilePath = Path.Combine(libraryPath, errorFileName); 
     var errorMessage = String.Format("Time: {0}\r\nError: Unhandled Exception\r\n{1}", 
     DateTime.Now, exception.ToString()); 
     File.WriteAllText(errorFilePath, errorMessage); 

     // Log to Android Device Logging. 
     Android.Util.Log.Error("Crash Report", errorMessage); 
    } 
    catch 
    { 
     // just suppress any error logging exceptions 
    } 
} 

/// <summary> 
// If there is an unhandled exception, the exception information is diplayed 
// on screen the next time the app is started (only in debug configuration) 
/// </summary> 
[Conditional("DEBUG")] 
private void DisplayCrashReport() 
{ 
    const string errorFilename = "Fatal.log"; 
    var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
    var errorFilePath = Path.Combine(libraryPath, errorFilename); 

    if (!File.Exists(errorFilePath)) 
    { 
     return; 
    } 

    var errorText = File.ReadAllText(errorFilePath); 
    new AlertDialog.Builder(this) 
     .SetPositiveButton("Clear", (sender, args) => 
     { 
      File.Delete(errorFilePath); 
     }) 
     .SetNegativeButton("Close", (sender, args) => 
     { 
      // User pressed Close. 
     }) 
     .SetMessage(errorText) 
     .SetTitle("Crash Report") 
     .Show(); 
} 

‪#‎endregion‬ 

И для iOS вы можете добавить такой код в свой AppDelegate.cs.

//iOS: Different than Android. Must be in FinishedLaunching, not in Main. 
// In AppDelegate 
public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary options) 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException; 
    TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException; 
    // Rest of your code... 
} 

/// <summary> 
// If there is an unhandled exception, the exception information is diplayed 
// on screen the next time the app is started (only in debug configuration) 
/// </summary> 
[Conditional("DEBUG")] 
private static void DisplayCrashReport() 
{ 
    const string errorFilename = "Fatal.log"; 
    var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Resources); 
    var errorFilePath = Path.Combine(libraryPath, errorFilename); 

    if (!File.Exists(errorFilePath)) 
    { 
     return; 
    } 

    var errorText = File.ReadAllText(errorFilePath); 
    var alertView = new UIAlertView("Crash Report", errorText, null, "Close", "Clear") { UserInteractionEnabled = true }; 
    alertView.Clicked += (sender, args) => 
    { 
     if (args.ButtonIndex != 0) 
     { 
      File.Delete(errorFilePath); 
     } 
    }; 
    alertView.Show(); 
} 

Он также включает возможность отображения журнала при отладке приложения. Конечно, вы можете реализовать свои собственные методы ведения журнала или обработки. Одна вещь, на которую вы могли бы взглянуть, - HockeyApp. Это обрабатывает необработанные исключения по умолчанию и отправляет их обратно вам, между прочим.

Обновление, поскольку оно по-прежнему найдено в Google: Для отчетов и аналитических отчетов о сбоях вы теперь хотите посмотреть на App Center. Это развитие HockeyApp и Xamarin Insights (среди прочих, таких как создание, распространение и push-уведомления), и теперь он действует как панель управления миссией для всего, что связано с приложениями, а не только с Xamarin.

Для UWP и WinPhone 8.1 должен быть обработчик UnhandledException в объекте Application. За дополнительной информацией обращайтесь к this answer. Я цитирую:

Для приложений на основе XAML вы можете использовать UnhandledException; однако, что только фиксирует исключения, которые возникают через инфраструктуру XAML (UI) , и вы не всегда получаете много информации о том, что вызывает корень , даже в InnerException.

Обновление для ОС Windows 8.1: UnhandledException также захватит исключения, которые создаются с помощью асинхронного ничтожного метода. В Windows 8, такие исключения могут привести к краху приложения. LunarFrog имеет хорошее discussion на этом сайте.

В принципе, вы должны добавить обработчик событий в конструкторе App() в App.xaml.cs: this.UnhandledException += (o, s) => {}.

+0

Спасибо, Джеральд за ваш ответ, я попробую об этом. Просто чтобы подтвердить, что HockeyApp не остановит работу приложения, он отправит отчет об ошибке, если мы не будем обрабатывать исключение. – Ashaar

+0

Это правильно! Он только гарантирует, что он отправит обратно стек и все релевантные, чтобы вы могли решить проблему до того, как ваши пользователи узнают, что их поразило :) Но кроме того, это может сделать намного больше! Поэтому проверьте это! Также, пожалуйста, примите это как ответ, если это поможет вам! –

+0

Спасибо, конечно, позвольте мне попробовать и обновить. – Ashaar

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