停止HockeyApp崩溃我的Xamarin iOS应用程序与UnobservedTaskException

本文关键字:应用程序 UnobservedTaskException iOS Xamarin HockeyApp 崩溃 我的 停止 | 更新日期: 2023-09-27 18:13:20

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

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

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

下面是我们用来启用Hockey

的代码
var manager = BITHockeyManager.SharedHockeyManager;
manager.Configure(APPID);
#if DEBUG
   manager.DebugLogEnabled = true;
#endif
manager.StartManager();

有没有人知道如何覆盖HockeyApp的默认行为为UnobservedTaskExceptions?

停止HockeyApp崩溃我的Xamarin iOS应用程序与UnobservedTaskException

UnobservedTaskException EventHandler在StartManager方法中是硬编码的,没有直接的方法可以删除。

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

裁判:https://github.com/bitstadium/HockeySDK-Xamarin/blob/28e67ecba14d00c8bea8043e08678af6044d33cf/source/HockeySDK.iOSBindings/Additions.cs承办

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

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

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

从。net 4.5开始,默认情况下,unobservedtaskexception不再导致应用程序崩溃。SDK还没有为此进行调整,仍然记录日志这些错误并导致程序退出,尽管这可能不是

希望继续使用处理程序的用户应该添加对RegisterUnobservedTaskExceptionHandler()或呼叫后的RegisterDefaultUnobservedTaskExceptionHandler()Configure() .

对于几个不想要自定义构建HockeySDK.Xamarin的客户端,我在 StartManager调用之后通过反射删除EventHandler,并添加我们的自定义处理程序。使用这种方法,如果需要的话,您将没有一个公共ThrowExceptionAsNative可用来抛出异常,但是一些更多的反射可以做到这一点:-/

根据这个支持问题,答案是否定的。

https://support.hockeyapp.net/discussions/problems/60521 hockeysdkuwp - 413 -不-方式- - - - - - -禁用unobservedtaskexceptions

和这个提交似乎是试图解决这个问题

https://github.com/bitstadium/HockeySDK-Windows/commit/1c1bc9715e64dd1283b3dc5db40ccdc9e59f4fc3

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

var ex = t.Exception;

当Task抛出异常时我取结果

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