【问题标题】:Xamarin global exception handling doesn't workXamarin 全局异常处理不起作用
【发布时间】:2021-12-05 13:00:41
【问题描述】:

我正在尝试记录我的 Xamarin.Forms 应用程序中发生的每个异常。目前我只担心 Android 设备,到目前为止,我已经看到了两种解决方法。

  1. 通过订阅 Xamarin 中的以下事件:
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
  1. 通过在 Xamarin.Android 中订阅以下事件:
AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironmentOnUnhandledException;

这两种方法都不适合我。这些几乎是您在寻找解决方案时遇到的仅有的两种解决方案,而且由于它们都不适合我,我认为我遇到了问题,但我很难过。到目前为止,我尝试抛出 NotImplementedException、DivideByZeroException 和另一个更复杂的异常,涉及数据绑定,但没有一个被捕获。

非常感谢任何帮助,在此先感谢。

【问题讨论】:

  • 你需要hook到Android和iOS项目,具体解决方法见:stackoverflow.com/a/39504448/8187800
  • @ColeX-MSFT 该帖子中引用的所有错误 API 都不是特定于平台的,只有文件日志记录才是。所有这些功能都可以在跨平台项目中实现????

标签: c# android exception xamarin.forms


【解决方案1】:

您可以使用 3 个挂钩来监控应用中的崩溃。它不是捕捉应用程序中抛出的每一个异常的完美解决方案,但它足以捕捉错误和大多数重大崩溃(你几乎永远无法捕捉到像 SIGABRT 这样的原生崩溃)。

AppDomain

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

这将捕获导致应用程序域崩溃的严重异常。您可以使用 AppCenter 来跟踪

void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    var exception = e.ExceptionObject as Exception;

    // Log somewhere
    Console.WriteLine($"App - OnUnhandledException - An exception occurred: {exception}");

    // Using App Center
    Crashes.TrackError((Exception)e.ExceptionObject);
}

TaskScheduler

TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;

这将捕获任务中未处理的异常。如果您有一个由于异常而崩溃的异步函数,这将捕获它。通常这些异常在您的应用程序中是不可见的。

void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    foreach (var exception in e.Exception.InnerExceptions)
    {
        // Log somewhere
        Console.WriteLine($"App - OnUnobservedTaskException - An exception occured: {exception.ToString()}");

        // Using App Center
        Crashes.TrackError(exception);
    }
}

Xamarin Forms Logs

Log.Listeners.Add(new DelegateLogListener(OnLogListener));

您可以在表单中收听内部记录器以获取诸如绑定错误等事件。这些日志在开发时非常有用,因为它们可以快速告诉您为什么视图和视图模型之间无法正常工作。

void OnLogListener(string arg1, string arg2)
{
    Debug.WriteLine($"App - OnLogListener - {arg1}: {arg2}");
}

应用中心

您绝对应该考虑将App CenterCrashes SDK 添加到您的应用程序中。下次加载应用时,任何未处理的崩溃都将上传到应用中心。这是为您的应用收集诊断信息的好方法。

提醒一句,由于链接/缺失引用导致的一些涉及本机问题的崩溃非常难以调试,并且根本无法在代码中处理。我给出的一个例子是,当 .dll 引用本机 .a 库但未正确引用该库时。这将立即杀死应用程序,而您没有机会处理它。

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 2018-09-11
    • 2016-01-16
    • 2017-01-23
    • 2016-11-03
    • 1970-01-01
    • 2015-12-21
    • 2011-09-29
    • 2011-06-17
    相关资源
    最近更新 更多