【问题标题】:Stopping HockeyApp crashing my Xamarin iOS app with UnobservedTaskException停止 HockeyApp 使用 UnobservedTaskException 使我的 Xamarin iOS 应用程序崩溃
【发布时间】:2016-10-15 06:36:32
【问题描述】:

我们有一个 Xamarin iOS 应用程序,它位于高度异步的 PCL 库之上。有时任务可能会在库中出现故障而未被观察到。因此,我们在 TaskScheduler 上连接了 UnobservedTaskException 处理程序,以确保这不一定会使我们的应用程序停机。

在我们启用 HockeyApp 来集中崩溃报告之前,这一直很好。 Hockey 为未观察到的任务异常添加了自己的处理程序,该异常处理程序总是在向其服务器发送崩溃报告后终止应用程序。我对他们为 AppDomain UnhandledException 处理程序执行此操作没有任何问题,但我需要阻止他们在未观察到的任务异常上杀死应用程序。

似乎有一种机制可以为这些异常安装自定义处理程序,但我看不到如何在 Xamarin iOS Hockey SDK 中安装它

这是我们用来启用曲棍球的代码

var manager = BITHockeyManager.SharedHockeyManager;

manager.Configure(APPID);
#if DEBUG
   manager.DebugLogEnabled = true;
#endif

manager.StartManager();

有谁知道如何覆盖 HockeyApp 对 UnobservedTaskExceptions 的默认行为?

【问题讨论】:

    标签: c# ios xamarin xamarin.ios hockeyapp


    【解决方案1】:

    UnobservedTaskException EventHandler 被硬编码在StartManager 方法中,无法直接删除。

    TaskScheduler.UnobservedTaskException += (sender, e) => ThrowExceptionAsNative(e.Exception);
    

    参考:https://github.com/bitstadium/HockeySDK-Xamarin/blob/28e67ecba14d00c8bea8043e08678af6044d33cf/source/HockeySDK.iOSBindings/Additions.cs#L43

    就个人而言,我从源代码构建,公开公开ThrowExceptionAsNative 并添加配置方法以在调用StartManager 时包含/排除默认处理程序。这就像 HockeyApp 对 HockeySDK-Windows api 所做的那样。

    因此,当捕获 UnobservedTaskException 时,您可以选择自行处理或将其作为本机异常抛出。

    这很像原始的 Xamarin 本机绑定,我不明白他们为什么这样做,因为在 HockeySDK-Windows 代码中,他们删除了 UnobservedTaskException 的默认处理:

    从 .NET 4.5 开始,默认情况下,UnobservedTaskExceptions 不再导致 应用程序崩溃。 SDK 尚未对此进行调整,仍会记录 这些错误并导致程序退出,尽管这可能不是 需要或打算。

    希望继续使用处理程序的用户应添加调用 RegisterUnobservedTaskExceptionHandler()RegisterDefaultUnobservedTaskExceptionHandler() 打电话后 Configure().

    对于一些不希望自定义构建 HockeySDK.Xamarin 的客户,我在 StartManager 调用之后通过反射删除 EventHandler,并添加到我们的自定义处理程序中。使用这种方法,如果需要,您将没有公共的ThrowExceptionAsNative 可用于将异常作为本机异常抛出,但可以进行更多反射:-/

    【讨论】:

    • 谢谢 - 这真的很有用
    • 嗨@SushiHangover,关于如何进行反射调用的任何细节?您是否建议做类似设置TaskScheduler.UnobservedTaskException = null 的事情? (通常只有类本身可以这样做)
    【解决方案2】:

    【讨论】:

    • 谢谢 Matthew - 看起来在过去的某个时候可能有办法做到这一点 github.com/bitstadium/HockeySDK-Windows/blob/… 但这可能只适用于 Win81 商店应用程序。
    • @RichardBlewett HockeySDK-Windows != HockeySDK-Xamarin 使用HockeySDK-Windows 您可以通过RegisterUnobservedTaskExceptionHandler 删除处理程序,但HockeySDK-Xamarin 中没有并行。更多详情见我的回答
    【解决方案3】:

    我用这行代码解决了这个问题:

    var ex = t.Exception;
    

    当Task抛出异常时 我拿结果

    if ((t.IsFaulted) || (t.IsCanceled))
    {
        var ex = t.Exception;
    

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多