首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin全局异常处理无效

Xamarin全局异常处理无效
EN

Stack Overflow用户
提问于 2021-10-18 13:05:49
回答 1查看 799关注 0票数 0

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

  1. 通过订阅在Xamarin举行的下列活动:
代码语言:javascript
复制
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
  1. 在Xamarin.Android中订阅以下事件:
代码语言:javascript
复制
AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironmentOnUnhandledException;

这两件事对我都没有用。这是你在寻找解决方案时遇到的唯一两种解决方案,因为这两种方法对我都不起作用,我想我搞错了,但我很困惑。到目前为止,我尝试抛出一个NotImplementedException、一个DivideByZeroException和另一个更复杂的异常,涉及数据绑定,没有一个被捕获。

任何帮助都是非常感谢的,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-10-20 10:46:20

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

AppDomain

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

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

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
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表格日志

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

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

代码语言:javascript
复制
void OnLogListener(string arg1, string arg2)
{
    Debug.WriteLine($"App - OnLogListener - {arg1}: {arg2}");
}

应用中心

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

一个警告词,一些涉及链接/缺少引用导致的本机问题的崩溃是令人难以置信的令人讨厌的调试,在代码中根本无法处理。我给出的一个例子是,当一个.dll引用一个本机.a库时,却没有正确地引用这个库。这将立即杀死应用程序,没有机会让你处理它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69616634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档