Quiero registrar el primer marco de pila que es visible desde mi propio código. ¿Es posible recorrer un seguimiento de pila desde un Throwable? Algo similar a StackWalker.walk(...)

2
jactor-rises 9 feb. 2021 a las 18:50

3 respuestas

La mejor respuesta

La forma más correcta es pagar la penalización y transmitir el Throwable.getStackTrace() ...

Sin embargo, esto vendrá con problemas de rendimiento, ya que jvm debe crear todos los elementos en el seguimiento de la pila (no solo los que desea) ...

Si pagar esta sobrecarga de rendimiento no es una opción, debe "recorrer la pila" utilizando StackWalker de la API móvil de la pila de Java 9 ... Esta pila se desviará del seguimiento de la pila de excepciones, y esto debe tenerse en cuenta al caminar por la pila ...

0
jactor-rises 12 mar. 2021 a las 07:42

Puede transmitir StacktraceElements:

Arrays.stream(throwable.getStackTrace().forEach(element ->{
    if(element.getClassName().startsWith("your.package"){
        logger.info(element.toString());
    }
});
1
frank 9 feb. 2021 a las 16:10

La mejor solución es transmitir los resultados de Throwable.getStackTrace()

Sé que puede transmitir la matriz, pero esto provocará una sobrecarga de rendimiento.

De hecho, no lo hará. Los gastos generales de capturar los marcos de la pila y convertirlos en una matriz de StackFrameElement se generan cuando se llama a fillInStackTrace(). Esto sucede durante la instanciación del objeto Throwable (excepción); es decir, antes tu throw.

Básicamente, ya ha asumido la sobrecarga de rendimiento de la creación de la matriz ... antes de decidir si desea transmitir los marcos de la pila o no.

Por otro lado, es posible crear una instancia de Throwable (a través de una subclase) con el argumento writableStackTrace establecido en false. Eso inhibe la llamada a fillInStackTrace. El resultado neto es que no se capturarán marcos de pila ... y no habrá nada que transmitir.

(Y no puede cambiar de opinión. Si los fotogramas de pila no se capturan cuando se crea una instancia de Throwable, se descartarán cuando la pila se desenrolle durante la propagación de la excepción).

1
Stephen C 12 mar. 2021 a las 08:09