Android - Drucken Sie die vollständige Ausnahme-Rückverfolgung, um sie zu protokollieren

94

Ich habe einen Try / Catch-Block, der eine Ausnahme auslöst, und ich möchte Informationen über die Ausnahme im Android-Geräteprotokoll sehen.

Ich habe das Protokoll des Mobilgeräts mit diesem Befehl von meinem Entwicklungscomputer gelesen:

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

Ich habe es zuerst versucht:

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

aber das druckt nichts in das Protokoll. Das ist schade, denn es hätte sehr geholfen.

Das Beste, was ich erreicht habe, ist:

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

Besser als nichts, aber nicht sehr befriedigend.

Wissen Sie, wie Sie die vollständige Rückverfolgung in das Protokoll drucken können?

Vielen Dank.

Dan
quelle

Antworten:

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

Expliziter mit weiteren Informationen

(Da dies die älteste Frage dazu ist.)

Die Android-Protokollmethoden mit drei Argumenten drucken den Stack-Trace für einen Exception, der als dritter Parameter angegeben wird. Beispielsweise

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

Wo trist die Ausnahme?

Laut diesem Kommentar verwenden diese Log-Methoden "die getStackTraceString()Methode ... hinter den Kulissen", um dies zu tun.

EboMike
quelle
4
Außerdem Mein Stil: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas
27
Vorsicht bei der Verwendung von e.getMessage () - getMessage () kann abhängig vom Typ der ausgelösten Ausnahme null zurückgeben, was an sich eine Ausnahme verursachen würde, da null in den Protokollmethoden nicht als Nachrichtenparameter unterstützt wird. Siehe hier
Uniqe
Außerdem ist es sinnvoller, im zweiten Parameter zu beschreiben, welche Art von Code diese Ausnahme verursacht hat. Die Nachricht ist ohnehin schon in der Ausgabe enthalten.
EboMike
1
Was @Unique sagt, ist sehr wichtig. Es ist besser, Log wie in der Antwort erwähnt zu verwenden, da es bereits den Stack-Trace druckt
Buddy
1
@SignoffTeamz Sie können einfach die Dokumentation lesen. Es ist eine Kennung, die das Protokoll anzeigt, mit der Sie das Protokoll leichter filtern und sehen können, welche App (und welcher Teil davon) die Nachricht geschrieben hat. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike
52

Diese Hilfsfunktion funktioniert auch gut, da Exception auch ein Throwable ist .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }
George
quelle
Es ist eine Zeichenfolge, mit der die App und der Speicherort angegeben werden. Jede Zeichenfolge reicht dort aus.
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() );
}

Oder ... weißt du ... was EboMike gesagt hat.

Mark Storer
quelle
3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}
Varun Narisetty
quelle
2

e.printStackTrace () druckt es mir. Ich glaube nicht, dass Sie den Logcat richtig ausführen. Führen Sie es nicht in einer Shell aus, sondern führen Sie es einfach aus

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

Falmarri
quelle
1

Die Standardausgabe und die Fehlerausgabe werden standardmäßig an / dev / null geleitet, sodass alles verloren geht. Wenn Sie diese Ausgabe protokollieren möchten, müssen Sie die hier gezeigten Anweisungen "Anzeigen von stdout und stderr" befolgen

toc777
quelle
1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}
Frank Hou
quelle
0

Im Kontext von Android musste ich die Ausnahme in einen String umwandeln:

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
quelle