2016-10-15 3 views
1

Wir haben eine Xamarin iOS-Anwendung, die auf einer stark asynchronen PCL-Bibliothek sitzt. Es besteht die Möglichkeit, dass ein Task gelegentlich in der Bibliothek Fehler macht und nicht beachtet wird. Wir haben deshalb den UnobservedTaskException-Handler auf dem TaskScheduler verdrahtet, um sicherzustellen, dass dies nicht notwendigerweise unsere App herunterbringt.Stoppen HockeyApp Absturz meiner Xamarin iOS App mit UnobservedTaskException

Dies funktionierte gut, bis wir HockeyApp für die Zentralisierung von Absturzberichten aktiviert haben. Hockey fügt einen eigenen Handler für unbeobachtete Aufgabenausnahmen hinzu, der die App immer beendet, nachdem ein Absturzbericht an seine Server gesendet wurde. Ich habe kein Problem damit, dies für den AppDomain UnhandledException-Handler zu tun, aber ich muss sie davon abhalten, die App bei unbeobachteten Task-Ausnahmen zu beenden.

Es scheint für die Installation einen benutzerdefinierten Handler für diese Ausnahmen, einen Mechanismus zu sein, aber ich kann nicht sehen, wie es in der Xamarin iOS Hockey SDK

Hier ist der Code, den wir Hockey

var manager = BITHockeyManager.SharedHockeyManager; 

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

manager.StartManager(); 
zu ermöglichen, verwenden installieren

Kann jemand das Standardverhalten von HockeyApp für UnobservedTaskExceptions überschreiben?

Antwort

3

Der UnobservedTaskException Eventhandler ist hartcodiert im StartManager Verfahren ohne direkte Art und Weise zu beheben versucht zu werden.

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

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

Ich persönlich von der Quelle bauen, öffentlich ThrowExceptionAsNative aussetzen und Konfigurationsmethoden in den include/die Standard-Handler aus, wenn sie StartManager aufgerufen wird. Das ist genau wie HockeyApp mit der HockeySDK-Windows API.

Wenn Sie also eine UnobservedTaskException fangen, haben Sie die Möglichkeit, diese selbst zu behandeln oder sie als native Ausnahme zu verwenden.

Dieses wie das Original Xamarin nativen Bindungen viel ist, und ich verstehe nicht, warum sie es, wie in den HockeySDK-Windows Code auf diese Weise tat, entfernt sie die Standardbehandlung von UnobservedTaskException:

Seit 4.5 .NET Standardmäßig führen UnobservedTaskExceptions nicht mehr zum Absturz der App . Das SDK wurde hierfür nicht angepasst und protokolliert weiterhin diese Fehler und bewirkt, dass das Programm beendet wird, obwohl dies möglicherweise nicht erforderlich oder beabsichtigt ist.

Benutzer, die den Handler verwenden, um fortzufahren möchten, sollten Anrufe RegisterUnobservedTaskExceptionHandler() oder RegisterDefaultUnobservedTaskExceptionHandler() nach Configure() Aufruf hinzufügen.

Für ein paar Kunden, die ich nach dem StartManager Anruf über Reflexion tun, um die EventHandler Entfernung keine benutzerdefinierten Build von HockeySDK.Xamarin wollen und in unserem benutzerdefinierten Handler hinzuzufügen. Mit diesem Ansatz werden Sie nicht eine öffentliche ThrowExceptionAsNative zur Verfügung haben, die Ausnahme als native eine werfen, wenn nötig, aber einige weitere Reflexion kann es tun: -/

+0

Danke - das ist wirklich nützlich –

+0

Hallo @SushiHangover, irgendwelche Details, wie man die Reflection Calls macht? Schlägst du vor, etwas wie "TaskScheduler.UnobservedTaskException = null" zu setzen? (Normalerweise könnte nur die Klasse selbst dies tun) – jonathanpeppers

1
+0

Dank Matthew werfen - es sieht aus wie es kann schon Möglichkeiten, hat dies in der Vergangenheit zu einem bestimmten Zeitpunkt zu tun https://github.com/bitstadium/ HockeySDK-Windows/blob/1520efdfab0b13145b0282bd23650988e417 a2bd/HockeySDK_Win81/HockeyClientExtensionsWin81.cs # L34, aber das war vielleicht nur für Win81 Store-Apps. –

+0

@RichardBlewett 'HockeySDK-Windows'! =' HockeySDK-Xamarin' Mit 'HockeySDK-Windows' können Sie den Handler über' RegisterUnobservedTaskExceptionHandler' entfernen, aber es gibt keine Parallele in 'HockeySDK-Xamarin'. Siehe meine Antwort für weitere Details – SushiHangover

0

ich dieses Problem mit dieser Codezeile gelöst:

var ex = t.Exception; 

, wenn die Aufgabe die Ausnahme ich nehme das Ergebnis

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