Android - imprimer le retour arrière complet des exceptions pour enregistrer


94

J'ai un bloc try / catch qui lève une exception et je voudrais voir des informations sur l'exception dans le journal de l'appareil Android.

J'ai lu le journal de l'appareil mobile avec cette commande depuis mon ordinateur de développement:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

J'ai essayé ceci en premier:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

mais cela n'imprime rien dans le journal. C'est dommage car cela aurait beaucoup aidé.

Le mieux que j'ai réalisé est:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

Mieux que rien mais pas très satisfaisant.

Savez-vous comment imprimer la trace complète dans le journal?

Merci.

Réponses:


165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

Plus explicitement avec plus d'informations

(Puisque c'est la question la plus ancienne à ce sujet.)

Les méthodes de journal Android à trois arguments imprimeront la trace de pile pour un Exceptionqui est fourni comme troisième paramètre. Par exemple

Log.d(String tag, String msg, Throwable tr)

tr est l'exception.

Selon ce commentaire, ces méthodes Log "utilisent la getStackTraceString()méthode ... dans les coulisses" pour ce faire.


4
De plus, Mon style: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas

27
Méfiez-vous en utilisant e.getMessage () - getMessage () peut renvoyer null, selon le type d'exception qui a été levée, ce qui entraînerait en soi une exception car null n'est pas pris en charge en tant que paramètre de message dans les méthodes Log. Voir ici
Uniqe

En outre, il est plus logique de décrire le type de code à l'origine de cette exception dans le deuxième paramètre. Le message est déjà inclus dans la sortie de toute façon.
EboMike

1
Ce que dit @Unique est très important. Il est préférable d'utiliser Log comme mentionné dans la réponse car il imprime déjà la trace de la pile
Buddy

1
@SignoffTeamz Vous pouvez simplement lire la documentation. C'est un identifiant qui affiche le journal qui vous permet de filtrer plus facilement le journal et de voir quelle application (et quelle partie de celle-ci) a écrit le message. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

52

Cette fonction d'aide fonctionne également bien puisque Exception est également un Throwable .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

C'est une chaîne utilisée pour spécifier l'application et l'emplacement. N'importe quelle chaîne fera l'affaire.
George

8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

Ou ... tu sais ... ce qu'EboMike a dit.


3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

2

e.printStackTrace () me l'imprime. Je ne pense pas que vous exécutez correctement le logcat. Ne l'exécute pas dans un shell, lance juste

/home/dan/android-sdk-linux_x86/tools/adb logcat


1

La sortie standard et la sortie d'erreur sont dirigées vers / dev / null par défaut, donc tout est perdu. Si vous souhaitez enregistrer cette sortie, vous devez suivre les instructions "Affichage de stdout et stderr" affichées ici


1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

0

Dans le contexte d'Android, j'ai dû convertir l'exception en chaîne:

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.