2015-06-11 18 views
8

Vorrei registrare le eccezioni non gestite, ma sto vedendo informazioni contrastanti su se e come ciò sia possibile.Registrazione delle eccezioni Xamarin non gestite (Android non acquisite)

Capisco che Xamarin solleva un evento AndroidEnvironment.UnhandledExceptionRaiser o AppDomain.CurrentDomain.UnhandledException e che posso iscrivermi a questo evento, ma ho l'impressione che Android stia uccidendo il mio processo e che non abbia accesso ad Android.Utils.Log o il file system.

Se si dà un'occhiata a Xamarin AdvancedAppLifecycleDemos/HandlingCrashes/App.cs c'è un argomento convincente che non è possibile registrare questa eccezione.

/// <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); 
    } 

Quindi, come può essere registrata un'eccezione non gestita?

+0

Hi Adam! Hai visto questo thread? https://forums.xamarin.com/discussion/13784/catching-global-exceptions-in-android notano il fatto che 'Console.Writeline' non sembra funzionare ma il' Android.Util.Log.Debug' è. –

+0

Non ho visto quel thread in particolare, ma ho ancora l'impressione che Android.Util.Log possa o meno funzionare poiché Android è attivamente nel processo di eliminazione del processo (come indicato in https: // github .com/Xamarin/MonoDroid-campioni/albero/padrone/AdvancedAppLifecycleDemos/HandlingCrashes). – Adam

+1

Hai considerato Xamarin.Insights? Potrebbe intercettare le eccezioni non gestite e gestite dopo l'inizializzazione su mainactivity/appdelegate ma sembra esserci un compromesso tra le informazioni che rallentano le applicazioni multithread sulla piattaforma Android. –

risposta

7

Xamarin Insights, HockeyApp o altri crash logger salvano i dati sugli arresti anomali in qualche modo prima che l'applicazione finisca il processo. Inviano i dati al server una volta che l'app viene riavviata (non possono inviarla subito mentre il processo viene ucciso). Quindi è assolutamente possibile. Anche se non sono sicuro che salvino i dati di crash sull'archiviazione del dispositivo (molto probabilmente) o su un database SQLite locale.

Questo codice HockeyApp utilizza per rilevare eccezioni non gestite. Potrebbe darvi alcune idee:

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); 

vorrei suggerire di provare a scrivere un file di testo per la memorizzazione locale all'interno di uno qualsiasi di questi metodi

0

Xamarin Insights è quello che vi serve: https://xamarin.com/insights

Con Xamarin Insights si può vedere una panoramica completa di eventuali incidenti e di identificare quale tipo di problemi e gli avvisi che si verificano nella vostra applicazione

Quando viene rilasciata la versione finale di Xamarin Studio 5.10 Anche Insights verrà integrato (Read More).

Problemi correlati