web-dev-qa-db-fra.com

Comment imprimer stacktrace pour une exception Android

Je veux imprimer la trace de la pile car pour le moment je l'ai en cours d'exécution.

} catch (IOException e) {
    throw new Error("Copying Failed");
}

Et on m'a dit d'imprimer e.stacktrace();

Comment puis-je faire cela?

29
Somk
} catch (IOException e) {
    Log.e("YOUR_APP_LOG_TAG", "I got an error", e);
}

Et vérifiez le LogCat pour la sortie.

72
Vit Khudenko

Une autre méthode, très utile:

try
{
...
}
catch (Exception e)
{
    Log.e(APP_TAG, "STACKTRACE");
    Log.e(APP_TAG, Log.getStackTraceString(e));
}
25
Bourbon

Dans Android vous devez utiliser les méthodes de journalisation qui fonctionnent bien avec la visionneuse de journaux Logcat utilisée par Android.

} catch (IOException e) {
   Log.e("YOUR ERROR TAG HERE", "Copying failed", e);
}

En utilisant la méthode Log.e qui prend un objet jetable comme argument, vous vous assurez que la classe de journal prendra la trace de pile et l'enregistrera correctement dans Logcat. Si vous utilisez e.printStackTrace, cela utilisera les méthodes de journalisation générales Java et n'apparaîtra pas correctement dans Logcat et dans certains cas, il ne sera pas possible de double-cliquer sur un nom de classe dans logcat pour sauter dans la classe et la méthode mentionnées dans le stacktrace.

Imprimer Stacktrace pour une division par zéro ressemblera à ceci:

11-21 20:55:47.360: W/System.err(989): Java.lang.ArithmeticException: divide by zero
11-21 20:55:47.379: W/System.err(989):  at test.tabs.TabChooser.onCreate(TabChooser.Java:15)
11-21 20:55:47.390: W/System.err(989):  at Android.app.Activity.performCreate(Activity.Java:4465)
11-21 20:55:47.410: W/System.err(989):  at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1049)
11-21 20:55:47.410: W/System.err(989):  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1919)
11-21 20:55:47.420: W/System.err(989):  at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1980)
11-21 20:55:47.420: W/System.err(989):  at Android.app.ActivityThread.access$600(ActivityThread.Java:122)
11-21 20:55:47.420: W/System.err(989):  at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1146)
11-21 20:55:47.420: W/System.err(989):  at Android.os.Handler.dispatchMessage(Handler.Java:99)
11-21 20:55:47.420: W/System.err(989):  at Android.os.Looper.loop(Looper.Java:137)
11-21 20:55:47.420: W/System.err(989):  at Android.app.ActivityThread.main(ActivityThread.Java:4340)
11-21 20:55:47.430: W/System.err(989):  at Java.lang.reflect.Method.invokeNative(Native Method)
11-21 20:55:47.430: W/System.err(989):  at Java.lang.reflect.Method.invoke(Method.Java:511)
11-21 20:55:47.430: W/System.err(989):  at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
11-21 20:55:47.430: W/System.err(989):  at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
11-21 20:55:47.430: W/System.err(989):  at dalvik.system.NativeStart.main(Native Method)

L'exception est consignée en tant qu'avertissement et la balise de journal n'est pas très utile.

La consignation correcte d'une division par zéro ressemblera à ceci:

11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): Copying failed
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): Java.lang.ArithmeticException: divide by zero
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at test.tabs.TabChooser.onCreate(TabChooser.Java:16)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.Activity.performCreate(Activity.Java:4465)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1049)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1919)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1980)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.ActivityThread.access$600(ActivityThread.Java:122)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1146)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.os.Looper.loop(Looper.Java:137)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Android.app.ActivityThread.main(ActivityThread.Java:4340)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Java.lang.reflect.Method.invokeNative(Native Method)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at Java.lang.reflect.Method.invoke(Method.Java:511)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356):    at dalvik.system.NativeStart.main(Native Method)

L'exception est correctement enregistrée en tant qu'erreur avec votre balise de journal et votre message de journal.

13
Janusz
} catch (IOException e) {
    e.printStackTrace();
}
10
AlexR

Il est très probable que l'on vous ait demandé d'imprimer la trace de la pile via e.printStackTrace();...

} catch (IOException e) {
    e.printStackTrace();
    throw new Error("Copying Failed");
}
1
Quintin Robinson