Android - wydrukuj pełny ślad wyjątku do dziennika

94

Mam blok try / catch, który zgłasza wyjątek i chciałbym zobaczyć informacje o wyjątku w dzienniku urządzenia z systemem Android.

Czytałem dziennik urządzenia mobilnego za pomocą tego polecenia z mojego komputera deweloperskiego:

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

Najpierw spróbowałem tego:

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

ale to nic nie drukuje w dzienniku. Szkoda, bo to by bardzo pomogło.

Najlepsze, co osiągnąłem, to:

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

Lepsze niż nic, ale niezbyt satysfakcjonujące.

Czy wiesz, jak wydrukować pełny ślad do dziennika?

Dzięki.

dan
źródło

Odpowiedzi:

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

Bardziej wyraźnie z dalszymi informacjami

(Ponieważ jest to najstarsze pytanie na ten temat).

Trzyargumentowe metody dziennika systemu Android wydrukują ślad stosu dla elementu Exceptionpodanego jako trzeci parametr. Na przykład

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

gdzie trjest wyjątek.

Zgodnie z tym komentarzem te metody Logów „używają getStackTraceString()metody… za kulisami”, aby to zrobić.

EboMike
źródło
4
Dodatkowo My style: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas,
27
Uważaj na e.getMessage () - getMessage () może zwrócić wartość null, w zależności od typu zgłoszonego wyjątku, co samo w sobie spowodowałoby wyjątek, ponieważ wartość null nie jest obsługiwana jako parametr komunikatu w metodach Log. Zobacz tutaj
Uniqe
Poza tym bardziej sensowne jest opisanie, jaki rodzaj kodu spowodował ten wyjątek w drugim parametrze. Wiadomość i tak jest już uwzględniona w danych wyjściowych.
EboMike
1
To, co mówi @Unique, jest bardzo ważne. Lepiej jest użyć Loga, jak wspomniano w odpowiedzi, ponieważ wyświetla on już ślad stosu
kolego,
1
@SignoffTeamz Możesz po prostu przeczytać dokumentację. Jest to identyfikator wyświetlający dziennik, który ułatwia filtrowanie dziennika i sprawdzanie, która aplikacja (i która jego część) napisała wiadomość. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike
52

Ta funkcja pomocnicza również działa dobrze, ponieważ wyjątek jest również przedmiotem do rzucania .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }
Jerzy
źródło
Jest to ciąg znaków używany do określenia aplikacji i lokalizacji. Dowolny ciąg się tam nada.
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() );
}

Albo ... wiesz ... co powiedział EboMike.

Mark Storer
źródło
3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}
Varun Narisetty
źródło
2

e.printStackTrace () drukuje to do mnie. Nie sądzę, że poprawnie uruchamiasz logcat. Nie uruchamiaj go w powłoce, po prostu biegnij

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

Falmarri
źródło
1

Standardowe wyjście i wyjście błędów są domyślnie kierowane do / dev / null, więc wszystko jest tracone. Jeśli chcesz zarejestrować to wyjście, musisz postępować zgodnie z instrukcjami „Wyświetlanie standardowego wyjścia i wyjścia błędów” pokazanych tutaj

toc777
źródło
1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}
Frank Hou
źródło
0

W kontekście Androida musiałem rzutować wyjątek na ciąg:

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
źródło