Android: imprima el rastreo de excepción completo en el registro

94

Tengo un bloque try / catch que lanza una excepción y me gustaría ver información sobre la excepción en el registro del dispositivo Android.

Leí el registro del dispositivo móvil con este comando desde mi computadora de desarrollo:

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

Probé esto primero:

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

pero eso no imprime nada en el registro. Es una pena porque hubiera ayudado mucho.

Lo mejor que he logrado es:

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

Mejor que nada, pero no muy satisfactorio.

¿Sabe cómo imprimir el rastreo completo del registro?

Gracias.

dan
fuente

Respuestas:

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

Más explícitamente con más información

(Dado que esta es la pregunta más antigua sobre esto).

Los métodos de registro de Android de tres argumentos imprimirán el seguimiento de la pila para un Exceptionque se proporciona como tercer parámetro. Por ejemplo

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

donde trestá la excepción.

Según este comentario, esos métodos Log "usan el getStackTraceString()método ... detrás de escena" para hacer eso.

EboMike
fuente
4
Además, Mi estilo: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas
27
Tenga cuidado con el uso de e.getMessage (): getMessage () puede devolver un valor nulo, según el tipo de excepción que se haya lanzado, lo que en sí mismo causaría una excepción, ya que nulo no se admite como parámetro de mensaje en los métodos de registro. Ver aquí
Uniqe
Además, tiene más sentido describir qué tipo de código causó esta excepción en el segundo parámetro. El mensaje ya está incluido en la salida de todos modos.
EboMike
1
Lo que dice @Unique es muy importante. Es mejor usar Log como se menciona en la respuesta, ya que ya imprime el seguimiento de la pila
Buddy
1
@SignoffTeamz Podrías leer la documentación. Es un identificador que muestra el registro que le facilita filtrar el registro y ver qué aplicación (y qué parte de ella) escribió el mensaje. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike
52

Esta función auxiliar también funciona bien ya que Exception también es Throwable .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }
Jorge
fuente
Es una cadena que se usa para especificar la aplicación y la ubicación. Cualquier cuerda servirá allí.
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() );
}

O ... ya sabes ... lo que dijo EboMike.

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

e.printStackTrace () me lo imprime. No creo que esté ejecutando logcat correctamente. No lo ejecutes en un caparazón, solo corre

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

Falmarri
fuente
1

La salida estándar y la salida de error se dirigen a / dev / null de forma predeterminada, por lo que se pierde todo. Si desea registrar esta salida, debe seguir las instrucciones "Visualización de stdout y stderr" que se muestran aquí.

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

En el contexto de Android, tuve que convertir la excepción a una cadena:

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
fuente