web-dev-qa-db-fra.com

Android gestion des exceptions, meilleure pratique?

Si mon application se bloque, elle se bloque quelques secondes avant que Android ne me le dise pas. L'application s'est bloquée et doit être fermée. Je pensais donc intercepter toutes les exceptions dans mon application avec un message d'erreur. général:

try {
    // ... 
} catch(Exception e) { 
    // ...
} 

Et créez un nouveau Activity qui explique le blocage instantané de l’application (et donne également aux utilisateurs l’occasion d’envoyer un courrier contenant les détails de l’erreur), au lieu d’avoir ce délai grâce à Android. Existe-t-il de meilleures méthodes pour accomplir cela ou est-ce découragé?

Mise à jour: J'utilise un Nexus 5 avec ART activé et je ne remarque pas le retard que je ressentais avec le plantage des applications (le "blocage" dont je parlais à l'origine). Je pense que puisque tout est maintenant du code natif, le crash se produit instantanément avec toutes les informations sur le crash. Peut-être que le Nexus 5 est juste rapide :) peu importe, ce n’est peut-être pas inquiétant dans les futures versions de Android (étant donné que ART sera l’exécution par défaut Android L).

72
ldam

Ici, vérifiez le lien pour référence .

Ici, vous créez une classe, dites ExceptionHandler que implements Java.lang.Thread.UncaughtExceptionHandler ..

Dans cette classe, vous ferez des choses qui sauvent des vies, comme la création de stacktrace et de gettin, prêts à télécharger un rapport d'erreur, etc.

Vient maintenant la partie importante , c’est-à-dire comment intercepter cette exception. Bien que ce soit très simple. Copiez la ligne de code suivante dans chaque activité juste après l'appel de la méthode super dans votre méthode onCreate remplacée.

Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

Votre activité peut ressembler à quelque chose comme ça…

public class ForceClose extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

        setContentView(R.layout.main);
    }
}

J'espère que cela t'aides...

94
CRUSADER

Vous pouvez simplement utiliser une boîte de dialogue d'alerte générique pour afficher rapidement des messages d'erreur. Par exemple...

//******************************************
//some generic method
//******************************************
private void doStuff()
{       
    try
    {
        //do some stuff here
    }
    catch(Exception e)
    {
        messageBox("doStuff", e.getMessage());
    }
}


//*********************************************************
//generic dialog, takes in the method name and error message
//*********************************************************
private void messageBox(String method, String message)
{
    Log.d("EXCEPTION: " + method,  message);

    AlertDialog.Builder messageBox = new AlertDialog.Builder(this);
    messageBox.setTitle(method);
    messageBox.setMessage(message);
    messageBox.setCancelable(false);
    messageBox.setNeutralButton("OK", null);
    messageBox.show();
}

Vous pouvez également ajouter d'autres options de traitement des erreurs à cette méthode, telles que print stacktrace.

9
Louis Evans

j'ai trouvé la méthode "wtf" (quel terrible échec) dans la classe Log. De la description:

Selon la configuration du système, un rapport peut être ajouté à DropBoxManager et/ou le processus peut être terminé immédiatement avec une boîte de dialogue d'erreur.

http://developer.Android.com/reference/Android/util/Log.html

J'espère que cela aide quelqu'un

3
sunyata