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.

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.


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));
    }

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.


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

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


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


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

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));
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.