我们有一个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();
有谁知道如何为UnobservedTaskExceptions覆盖HockeyApp的默认行为?
该UnobservedTaskException
事件处理程序是硬编码的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一样。
因此,在捕获一个a时,UnobservedTaskException
您可以选择自己处理它或将其作为本机异常抛出。
这很像原始的Xamarin本机绑定,而且我不明白他们为什么这样做,就像在HockeySDK-Windows
代码中那样,他们删除了默认的处理方式UnobservedTaskException
:
从.NET 4.5开始,默认情况下,UnobservedTaskExceptions不再导致应用程序崩溃。SDK尚未针对此进行调整,但仍然会记录这些错误并导致程序退出,尽管这可能不是必需的或无意的。
希望继续使用处理程序的用户应在
RegisterUnobservedTaskExceptionHandler()
或RegisterDefaultUnobservedTaskExceptionHandler()
之后添加调用Configure()
。
对于几个不希望自定义构建的客户HockeySDK.Xamarin
,我在调用后EventHandler
通过反射进行了删除,并添加了我们的自定义处理程序。使用这种方法,如果需要,您将没有公众可以将异常作为本机异常抛出,但是可以通过更多的反思来做到这一点:-/StartManager
ThrowExceptionAsNative
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句