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.

dan
la source

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.

EboMike
la source
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));
    }
George
la source
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.

Mark Storer
la source
3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}
Varun Narisetty
la source
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

Falmarri
la source
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

toc777
la source
1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}
Frank Hou
la source
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));
}
Donato
la source