Luego de mucho batallar pudimos encontrar la contestación de esta dificultad que tantos usuarios de este espacio tienen. Si deseas aportar algo más no dejes de aportar tu información.
Solución:
Siguiendo mi comentario, esto es en realidad lo que tenía en mente. Eso sí, no tengo una forma de probarlo en este momento.
Lo que pasas de tu subproceso principal es New Exception().getStackTrace()
. O mejor aún, como comentó @Radiodef, Thread.currentThread().getStackTrace()
. Así que es básicamente un StackTraceElement[]
array.
Ahora, puedes tener algo como:
public class CrossThreadException extends Exception
public CrossThreadException( Throwable cause, StackTraceElement[] originalStackTrace )
// No message, given cause, no supression, stack trace writable
super( null, cause, false, true );
setStackTrace( originalStackTrace );
Ahora en su cláusula de captura puede hacer algo como:
catch ( Throwable cause )
LOG( "This happened", new CrossThreadException( cause, originalStackTrace ) );
Lo que le dará un límite entre los dos rastros de pila.
Puedes usar el Future
objeto que regresó de su invocación de envío, luego invoque el get()
método, si ocurriera alguna excepción durante la ejecución de la tarea, se volverá a lanzar.
Otra opción es personalizar el controlador de excepciones predeterminado para la fábrica de subprocesos que crea los subprocesos para su ExecutorService
. Ver para más detalles: Thread.UncaughtExceptionHandler
Si entiendes que ha sido de ayuda nuestro post, te agradeceríamos que lo compartas con el resto desarrolladores de esta manera contrubuyes a extender nuestro contenido.