Не могли бы вы дать мне знать, как обрабатывать глобальное исключение (без крушения приложения) в проекте платформы Xamarin Cross.Глобальная обработка исключений на платформе Xamarin Cross
ответ
Не существует способа «сделать 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) => {}
.
Спасибо, Джеральд за ваш ответ, я попробую об этом. Просто чтобы подтвердить, что HockeyApp не остановит работу приложения, он отправит отчет об ошибке, если мы не будем обрабатывать исключение. – Ashaar
Это правильно! Он только гарантирует, что он отправит обратно стек и все релевантные, чтобы вы могли решить проблему до того, как ваши пользователи узнают, что их поразило :) Но кроме того, это может сделать намного больше! Поэтому проверьте это! Также, пожалуйста, примите это как ответ, если это поможет вам! –
Спасибо, конечно, позвольте мне попробовать и обновить. – Ashaar
- 1. BLE на платформе Xamarin Cross
- 2. Angular2 Глобальная обработка исключений
- 3. Глобальная обработка исключений в Джерси
- 4. Обработка исключений в платформе воспроизведения
- 5. Глобальная обработка исключений в .NET?
- 6. Обработка исключений в платформе воспроизведения
- 7. Глобальная обработка исключений весной, Tomcat7
- 8. Можно сделать скользящий выдвижной ящик на платформе xamarin cross?
- 9. Глобальная обработка исключений в Struts 2
- 10. Глобальная обработка исключений в приложении для воспроизведения
- 11. Глобальная обработка исключений в Джерси и весне?
- 12. Глобальная обработка исключений для управления winforms
- 13. Глобальная обработка исключений в ASP.NET 5
- 14. Глобальная обработка исключений в игровой инфраструктуре java 2.3.7
- 15. Как использовать пользовательский шрифт в платформе Xamarin Cross
- 16. Xamarin cross platform iOS app
- 17. ActiveRecord :: RecordNotUnique глобальная обработка
- 18. Глобальная обработка исключений в многопоточных джунглях - Fail Safe/Restart
- 19. Глобальная обработка исключений для вызовов REST в Ember-CLI
- 20. Обработка исключений на Python
- 21. глобальная обработка исключений для открытых открытых весенних данных
- 22. Глобальная обработка исключений и регистрация в asp.net MVC Core
- 23. Глобальная обработка исключений в приложении WPF с Caliburn.Micro
- 24. Глобальная обработка исключений в Web API 2.1 и NLog
- 25. Push-уведомление в кросс-платформе xamarin
- 26. Обработка исключений
- 27. Обработка исключений
- 28. Обработка исключений
- 29. Обработка исключений?
- 30. Обработка исключений
Посмотрите на HockeyApp https://hockeyapp.net/ – Milen