Pregunta

¿Hay alguna forma de detectar cuándo un método genera una escritura en STDERR? Estoy tratando de pre-pendir alguna información con cada escritura STDERR.

supongamos que nuestro método es:

parser.thatGeneratesSTDERR();

generará algo así como

línea 37:29 no hay alternativa viable en el carácter 'a'

¿puedo envolverlo con algo que atrapa el stderr para ser escrito y pre-pendir información para que se vea así en su lugar:

Archivo: mybadfile.txt - línea 37:29 no hay alternativa viable en el carácter 'a'

Sé que probablemente podría profundizar en el código real que escribe STDERR, pero realmente no quiero hacerlo, prefiero simplemente envolver algún código alrededor de este método.

Debo señalar que este método no siempre genera STDERR, la razón por la que estoy tratando de atraparlos es que NO DEBE generar ningún STDERR, pero dado que esto se llama en bastantes archivos (más de 40) Nunca sé qué archivo está generando el mensaje de error: lleva mucho tiempo encontrarlo.

ACTUALIZACIÓN así que sí, podemos cambiar nuestro STDERR. Solo estaba olvidando que necesito anular mi println en mi nuevo STDERR ... aquí está el código relevante:

public static String errfile = "";

static {
  final PrintStream currentErr = System.err;
  PrintStream newErr = new PrintStream(currentErr)
  { 
    public void println(String string) {
      print("File: " + errfile + " --");
      print(string);
      super.println();
    }
  };

  System.setErr(newErr);
}

entonces, para cada archivo que estoy probando, todo lo que tengo que hacer es cambiar errfile al nombre del archivo y mi salida se espera ...

muchas gracias

¿Fue útil?

Solución

No estoy seguro de si esto funcionará, dado cómo funciona System.setErr.

Crearía una nueva clase que amplía el flujo de impresión y sobrescribe los métodos para anteponer su comentario. Luego configure el flujo de error en su nuevo flujo de impresión. No llame a System.err.printxxx desde esta nueva clase.

ex ...

class PrependPrintStream extends PrintStream {

PrependPrintStream(PrintStream ps, String pre){...}
...
public void print(boolean b) {
super.print(this.pre);
super.print(b);
}
...

Miré en el impl PrintStream del sol, y parece que todo delegado printxxx escribe (String) que es privado en lugar de protegido. Supongo que puedes copiar / pegar el código.

EDITAR ::

Una solución mucho mejor es usar Logging en lugar de System.err. Esto le permite apagar y encender sus declaraciones y le permite crear un controlador de errores personalizado. Su controlador específico podría anteponer la declaración que desea a la cadena antes de imprimir en System.err. Esto también tiene la ventaja de que solo las declaraciones que usan su registrador específico tendrían el texto antepuesto y otras llamadas a System.err no.

Otros consejos

Parece que probablemente quiera ver la Programación Orientada a Aspectos (AOP). Con AOP, puede crear un proxy para el analizador al que está llamando. Antes de llamar al método thatGeneratesSTDERR (), puede hacer que invoque su llamada. Desde su llamada, puede generar la información que desee.

Tenga en cuenta que puede tomar un poco de lectura comprender cómo funciona AOP.

AspectJ - http://www.eclipse.org/aspectj/

Alianza AOP - http://sourceforge.net/projects/aopalliance

Puede usar System.setErr para redirigir stderr a su propio PrintStream.

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