¿Cómo obtener el texto de un seguimiento de pila de excepción en Java ME?

StackOverflow https://stackoverflow.com/questions/225489

  •  03-07-2019
  •  | 
  •  

Pregunta

En Java normal, puede obtener el texto de un seguimiento de pila pasando un PrintWriter a printStackTrace. Tengo la sensación de que conozco la respuesta a esta pregunta (es decir, " No ") pero

¿Hay alguna forma de obtener el texto de un seguimiento de pila en JavaME como una cadena?

Actualización :

Debo mencionar que estoy restringido a CLDC 1.0

¿Fue útil?

Solución

AFAIK no hay forma de obtener el seguimiento de la pila como un valor de cadena, a menos que una plataforma específica proporcione un medio para anular la secuencia System.err predeterminada. En la plataforma BlackBerry, arroja el seguimiento de la pila en catch (Exception) para ahorrar memoria, sin embargo, no hace esto en catch (Throwable) y da Acceso al seguimiento de la pila a través del registro de eventos del dispositivo.

Lo que acabé haciendo es capturar Throwable en lugar de Exception en el último momento posible e imprimir el seguimiento de la pila desde allí. Por supuesto, esto tiene el peligro de que también esté detectando java.lang.Error , que no es muy bueno, especialmente si su OutOfMemoryError , aunque es una llamada a System.gc () antes de imprimir el seguimiento de la pila parece reducir el riesgo y no hemos tenido ningún problema con él.

Buscaría en cualquier plataforma a la que te dirijas y veré si dan acceso a System.err en algún lugar. Siempre puedes conectar un depurador y debería aparecer en la salida de la consola, aunque parece que estás buscando pistas de pila 'en el campo'.

Otros consejos

dos soluciones:

  • reproduce la excepción en el emulador. El kit de herramientas inalámbricas y Netbeans imprimirán los seguimientos de pila en su computadora.

  • usa un dispositivo Symbian.

Antes del Feature Pack 2 of Series 60 3rd edition, los teléfonos Symbian usan la máquina virtual Sun Hotspot java. Se adaptó al sistema operativo Symbian al vincularlo a una implementación parcial de la biblioteca estándar de C

.

Esto permitió a Symbian crear un programa en C ++ llamado redirector, que era capaz de capturar la salida estándar de la VM y el error estándar, incluidos los seguimientos de la pila de excepciones de Java.

el redirector de c ++ nunca se actualizó para la versión 9 de Symbian OS. En su lugar, un " redirect: // " El protocolo GCF se introdujo en la máquina virtual,

Desde un MIDlet separado, abra un InputStream desde la conexión devuelta por Connector.open (" redirect: // " ;, Connector.READ); luego puede capturar los seguimientos de la pila de excepciones en teléfonos Symbian.

EDITAR: " redirigir: // " está de vuelta en la 5ª edición de Series60 y " redirect: // test " debería funcionar en el paquete de características 2 de la 3ª edición de Series60

No creo que haya una manera de hacerlo en CLDC 1.0. Sin embargo, en algunos dispositivos / sistemas operativos, la clase de excepción subyacente podría proporcionar una manera de acceder al seguimiento de la pila (piense en las nuevas versiones de CLDC). Simplemente inspeccione la instancia de excepción en tiempo de ejecución utilizando la reflexión para ver qué miembros expone en sus plataformas de destino. Luego, puede escribir algún código que pueda extraer de forma segura el seguimiento de la pila en las plataformas que ofrecen dicha información.

He creado una herramienta que se puede usar para registrar los seguimientos de pila adecuados también en CLDC. Compruébelo en http://jarrut.sourceforge.net . Todavía es muy nuevo y puede tener algunos bordes ásperos, pero funciona para mí y no podría imaginarme desarrollando MIDlets sin él. La mejor manera de usarlo es combinarlo con microlog.

Desafortunadamente, la herramienta actualmente requiere CLDC 1.1, por lo que es posible que no resuelva el problema para el póster original.

Puede hacer que PrintWriter escriba en ByteArrayOutputStream y reconstruya la cadena a partir de los bytes.

try{
    throw new Exception("Message");     
} catch (Exception ex){
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ex.printStackTrace(new PrintStream(out));
    System.out.println(new String(out.toByteArray()));
}

No es bonito, pero debería funcionar prácticamente en todas partes. Antes de probar lo anterior, asegúrese de no tener acceso a [Throwable # getStackTrace] ( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace ()) , Eclipse afirma que está disponible en CDC / Foundation 1.1, pero eso no dice nada sobre otros perfiles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top