Android - imprime o backtrace de exceção completa para registrar

94

Eu tenho um bloco try / catch que lança uma exceção e gostaria de ver informações sobre a exceção no log do dispositivo Android.

Eu li o log do dispositivo móvel com este comando do meu computador de desenvolvimento:

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

Eu tentei isso primeiro:

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

mas isso não imprime nada no log. É uma pena porque teria ajudado muito.

O melhor que consegui é:

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

Melhor do que nada, mas não muito satisfatório.

Você sabe como imprimir o backtrace completo no log?

Obrigado.

dan
fonte

Respostas:

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

Mais explicitamente com mais informações

(Uma vez que esta é a pergunta mais antiga sobre isso.)

Os métodos de log do Android de três argumentos imprimirão o rastreamento de pilha para um Exceptionque é fornecido como o terceiro parâmetro. Por exemplo

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

onde trestá a exceção.

De acordo com este comentário, esses métodos de Log "usam o getStackTraceString()método ... nos bastidores" para fazer isso.

EboMike
fonte
4
Além disso, Meu estilo: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas de
27
Cuidado ao usar e.getMessage () - getMessage () pode retornar nulo, dependendo do tipo de exceção que foi lançada, o que por si só causaria uma exceção, pois nulo não é suportado como um parâmetro de mensagem nos métodos de Log. Veja aqui
Uniqe
Além disso, faz mais sentido descrever que tipo de código causou essa exceção no segundo parâmetro. A mensagem já está incluída na saída de qualquer maneira.
EboMike
1
O que @Unique diz é muito importante. É melhor usar o Log conforme mencionado na resposta, pois ele já imprime o rastreamento da pilha
Buddy
1
@SignoffTeamz Você pode apenas ler a documentação. É um identificador que mostra o log que torna mais fácil para você filtrar o log e ver qual aplicativo (e qual parte dele) escreveu a mensagem. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike
52

Esta função auxiliar também funciona bem, uma vez que Exception também é um Throwable .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }
George
fonte
É uma string usada para especificar o aplicativo e o local. Qualquer string serve lá.
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 ... você sabe ... o que EboMike disse.

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

e.printStackTrace () imprime para mim. Não acho que você esteja executando o logcat corretamente. Não execute em um shell, apenas execute

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

Falmarri
fonte
1

A saída padrão e a saída de erro são direcionadas para / dev / null por padrão, portanto, tudo é perdido. Se você deseja registrar esta saída, você precisa seguir as instruções "Visualizando stdout e stderr" mostradas aqui

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

No contexto do Android, tive que lançar a exceção para uma string:

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
fonte