Domanda

Esiste un modo per catturare quando un metodo genera una scrittura su STDERR? Sto cercando di pre-sospendere alcune informazioni con ogni scrittura STDERR.

diciamo che il nostro metodo è:

parser.thatGeneratesSTDERR();

genererà qualcosa di simile

riga 37:29 nessuna alternativa praticabile al carattere "a"

posso semplicemente avvolgerlo con qualcosa che catturi lo stderr da scrivere e pre-penderne un po ' informazioni in questo modo, invece:

File: mybadfile.txt - riga 37:29 nessuna alternativa praticabile al carattere "a"

So che probabilmente potrei scavare attraverso il codice reale che fa la scrittura STDERR ma non voglio davvero farlo - preferirei semplicemente avvolgere un po 'di codice attorno a questo metodo.

Dovrei notare che questo metodo non genera sempre STDERR - il motivo per cui sto cercando di catturarli è che NON DOVREBBE generare alcun STDERR - ma dal momento che questo viene chiamato su un bel po 'di file (oltre 40) Non so mai quale file sta generando il messaggio di errore - ci vuole un'eternità per trovare.

Aggiorna quindi, possiamo cambiare il nostro STDERR - stavo solo dimenticando che ho bisogno di sostituire la mia stampa nel mio nuovo STDERR ... ecco il codice pertinente:

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);
}

quindi per ogni file che sto testando tutto quello che devo fare è cambiare errfile nel nome del file e il mio output risulta previsto ...

grazie mille!

È stato utile?

Soluzione

Non sono sicuro che funzioni, dato come funziona System.setErr.

Vorrei creare una nuova classe che estende il flusso di stampa e sovrascrive i metodi per anteporre il tuo commento. Quindi impostare il flusso di errori sul nuovo flusso di stampa. Non chiamare System.err.printxxx da questa nuova classe.

ex ...

class PrependPrintStream extends PrintStream {

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

Ho esaminato l'impianto PrintStream di sun e sembra che tutti i delegati di printxxx scrivano (String) che è privato anziché protetto. Immagino che tu possa copiare / incollare il codice.

EDIT ::

Una soluzione molto migliore è usare la registrazione invece di System.err. Ciò consente di disattivare e attivare le dichiarazioni e di creare un gestore errori personalizzato. Il gestore specifico potrebbe anteporre l'istruzione desiderata alla stringa prima di stampare su System.err. Questo ha anche il vantaggio che solo le istruzioni che usano il tuo logger specifico avrebbero il testo anteposto e altre chiamate a System.err no.

Altri suggerimenti

Sembra che tu voglia guardare Aspect Oriented Programming (AOP). Utilizzando AOP, è possibile creare un proxy per il parser che si sta chiamando. Prima che il metodo chiamiGeneratesSTDERR () puoi farlo richiamare. Dalla tua chiamata puoi generare le informazioni che desideri.

Nota che potrebbe essere necessario un po 'di lettura per capire come funziona AOP.

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

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

Puoi usare System.setErr per reindirizzare stderr sul tuo PrintStream.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top