2014-11-25 12 views
9

Ho navigato su Internet per un periodo piuttosto lungo nella speranza di una soluzione, e ho trovato una serie di risposte, ma nessuna di queste sembra ottenere ciò che voglio.Lottando per capire la gestione delle eccezioni Xamarin

Sto tentando di gestire le eccezioni senza causare l'arresto anomalo dell'app. Piuttosto che l'app che sta semplicemente uscendo, preferirei catturare l'eccezione, presentare all'utente un errore più user-friendly (magari un avviso messagebox) e consentire loro di continuare a operare nell'app.

E 'possibile interrompere l'app dal salvataggio?

Il modo in cui sto attualmente tentando di prendere questo è come il seguente:

public class Login : Activity 
{ 
    int count = 1; 
    Session mySession; 

    protected override void OnCreate(Bundle bundle) 
    { 
     AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidException; 

      base.OnCreate(bundle); 

      // Set our view from the "main" layout resource 
      SetContentView(Resource.Layout.Login); 


      Button button = FindViewById<Button>(Resource.Id.Login); 
      string accountCode = Resource.Id.AccountCode.ToString(); 
      string password = Resource.Id.Password.ToString(); 

      // button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; 
      button.Click += delegate 
      { 
        throw new Exception("LETS THROW A RANDOM EXCEPTION"); 

      }; 

    } 


    void HandleAndroidException(object sender, RaiseThrowableEventArgs e) 
    { 
     Log.Error("INTERNAL DEBUG", "PLEASE HANDLE MY EXCEPTION!"); 
     e.Handled = true; 
     System.Console.Write("YOU'VE JUST BEEN HANDLED!"); 
    } 
} 

Come potete vedere sto gettando una deroga generale e il tentativo di prendere questo con un'UnhandledExceptionRaiser. L'ho usato come riferimento: http://androidapi.xamarin.com/index.aspx?link=E%3AAndroid.Runtime.AndroidEnvironment.UnhandledExceptionRaiser

Sono in grado di trovare il mio messaggio nello strumento "Registrazione dispositivo Android", tuttavia viene attivato dopo che si è verificato un errore di eccezione non gestita. Penso che questo significhi che qualcosa all'interno di Xamarin sta avendo il primo crack all'eccezione e sta cadendo. Sicuramente ci deve essere un modo per fermare questo ??

Ho visto innumerevoli esempi online in cui le persone hanno fatto domande simili e non c'è stata una soluzione chiara. Alcune persone hanno offerto alcune soluzioni, ma queste non fanno effettivamente ciò che avevo previsto.

È letteralmente incredibile per me se questo non può essere fatto.

Questa è la mia prima volta che uso Xamarin e anche la mia prima volta a sviluppare un'applicazione per dispositivi mobili, quindi mi scuso se sono ignorante su qualcosa.

Si prega di aiutare !!!

risposta

9

C'è una cosa importante da comprendere sulla natura di un'eccezione Unhandled in Android, non ce n'è una .... nel framework Android che utilizza Java è un'eccezione Uncaught che significa che non è possibile "gestire" "o recuperarlo come faresti in un ambiente .Net. Xamarin (Mono) internamente "gestisce" quelle eccezioni non catturate circondando letteralmente tutto con try-catch e sollevando l'evento Unhandled ma questo è oltre il punto. È anche scoraggiato interagire con l'interfaccia utente per vari motivi. In teoria ci sono diversi "soluzioni temporanee" per visualizzare una finestra di dialogo per l'utente o riavviare l'app, nessuna delle quali consiglierei di fare. Dovresti invece circondare le aree sensibili con clausole try-catch per gestire le eccezioni previste, in quanto per quelle inattese è sufficiente utilizzare un componente di reporting delle eccezioni e aggiornare l'app dopo aver analizzato le eccezioni riportate.

Inoltre, sposterei l'abbonamento evento alla classe Application ma questa è una preferenza personale. Mi piace così:

public class YourAppClass : Application 
{ 
    public override void OnCreate() 
    { 
     AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidException; 
    } 
} 
+0

Grazie Alex. Apprezzo la risposta. Potresti darmi una raccomandazione o due per alcuni componenti di reporting? Potresti risparmiare un minuto per approfondire l'uso della classe Application e della struttura di classe di base che hai in tutta l'app? grazie! –

+0

I componenti sono HockeyApp e Raygun (sono quelli con cui ho lavorato). http://components.xamarin.com/gettingstarted/hockeyappandroid https://components.xamarin.com/view/raygun4net E per quanto riguarda la classe Application vedere la mia risposta modificata. –

+0

Grazie Alex sarò sicuro di controllare quelli fuori. Quindi il concetto generale è quello di creare una classe Application e quindi ogni attività implementa la classe dell'applicazione? Siamo spiacenti - nuovo su Xamarin/mobile dev! –