2015-06-11 5 views
8

Chciałbym rejestrować nieobsługiwane wyjątki, ale widzę sprzeczne informacje na temat tego, czy i jak może to być możliwe.Rejestrowanie wyjątków Xamarin nieobsługiwanych (Android uncaught)

Rozumiem, że Xamarin podnosi wydarzenie AndroidEnvironment.UnhandledExceptionRaiser lub AppDomain.CurrentDomain.UnhandledException i że mogę zasubskrybować to wydarzenie, ale mam wrażenie, że Android zabija mój proces i że nie mam dostępu do Android.Utils.Log lub system plików.

Jeśli spojrzeć na Xamarin's AdvancedAppLifecycleDemos/HandlingCrashes/App.cs jest przekonujący argument, że nie można zarejestrować tego wyjątku.

/// <summary> 
    /// When app-wide unhandled exceptions are hit, this will handle them. Be aware however, that typically 
    /// android will be destroying the process, so there's not a lot you can do on the android side of things, 
    /// but your xamarin code should still be able to work. so if you have a custom err logging manager or 
    /// something, you can call that here. You _won't_ be able to call Android.Util.Log, because Dalvik 
    /// will destroy the java side of the process. 
    /// </summary> 
    protected void HandleUnhandledException(object sender, UnhandledExceptionEventArgs args) 
    { 
     Exception e = (Exception)args.ExceptionObject; 

     // log won't be available, because dalvik is destroying the process 
     //Log.Debug (logTag, "MyHandler caught : " + e.Message); 
     // instead, your err handling code shoudl be run: 
     Console.WriteLine("========= MyHandler caught : " + e.Message); 
    } 

W jaki sposób można rejestrować nieobsługiwany wyjątek?

+0

Cześć Adam! Widziałeś ten wątek? https://forums.xamarin.com/discussion/13784/catching-global-exceptions-in-android zauważ, że 'Console.Writeline' nie działa, ale' Android.Util.Log.Debug' jest. –

+0

Nie widziałem tego wątku w szczególności, ale wciąż mam wrażenie, że Android.Util.Log może, ale nie musi działać, ponieważ Android aktywnie uczestniczy w procesie zabijania twojego procesu (jak podano w https: // github .com/xamarin/monodroid-samples/drzewo/master/AdvancedAppLifecycleDemos/HandlingCrashes). – Adam

+1

Czy brałeś pod uwagę Xamarin.Insights? Może przechwycić nieobsługiwane i obsługiwane wyjątki po inicjalizacji na mainactivity/appdelegate, ale wydaje się, że jest to kompromis w spostrzeżeniach spowalniających aplikacje wielowątkowe na platformie Android. –

Odpowiedz

7

Xamarin Insights, HockeyApp lub inne rejestratory awarii zapisują dane o awariach w jakiś sposób, zanim aplikacja zakończy proces. Wysyłają dane na serwer po ponownym uruchomieniu aplikacji (nie mogą jej wysłać natychmiast po zabiciu procesu). To całkowicie możliwe. Chociaż nie jestem pewien, czy zapisują dane dotyczące awarii w pamięci urządzenia (najprawdopodobniej), czy w lokalnej bazie danych SQLite.

Ten kod HockeyApp używa do przechwytywania nieobsługiwanych wyjątków. To może dać Ci kilka pomysłów:

AndroidEnvironment.UnhandledExceptionRaiser += (sender, args) => 
{ 
    TraceWriter.WriteTrace(args.Exception); 
    args.Handled = true; 
}; 

AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
    TraceWriter.WriteTrace(args.ExceptionObject); 

// Wire up the unobserved task exception handler 
TaskScheduler.UnobservedTaskException += (sender, args) => 
    TraceWriter.WriteTrace(args.Exception); 

Proponuję spróbować i napisać plik tekstowy do lokalnego przechowywania w żadnym z tych metod

0

Xamarin Insights jest to, czego potrzebujesz: https://xamarin.com/insights

Z Xamarin Insights widać kompletny przegląd wszelkich awarii oraz określić, jaki rodzaj problemów i ostrzeżeń, które mają miejsce w swojej aplikacji

Po opublikowaniu ostatecznej wersji Xamarin Studio 5.10 Insights zostanie również zintegrowany (Read More).