Frage

Gibt es irgendeine Weise, die ich fangen kann, wenn eine Methode einen Schreibvorgang auf STDERR erzeugt? Ich versuche, einige Informationen mit jedem STDERR schreiben vorzunehmen Anh.

Lassen Sie uns sagen, dass unsere Methode ist:

parser.thatGeneratesSTDERR();

es wird so etwas wie

erzeugen

line 37:29 keine brauchbare Alternative zu Zeichen 'a'

kann ich wickeln Sie es nur mit etwas, das die stderr fängt geschrieben und Pre-pend etwas zu Informationen, so dass es wie diese Stelle aussehen werden:

Datei: mybadfile.txt - line 37:29 keine brauchbare Alternative zu Zeichen 'a'

Ich weiß, dass ich wahrscheinlich durch den eigentlichen Code graben könnte, die die STDERR Schreiben tut, aber ich möchte wirklich nicht, das zu tun. - Ich würde lieber wickeln nur einige Code, um dieses Verfahren anstelle

sollte ich beachten Sie, dass diese Methode nicht immer STDERR erzeugen - der Grund, warum ich sie zu fangen bin versucht, ist, dass es nicht STDERR werden zu erzeugen, sollten - aber da dies auf ganz wenige Dateien genannt (über 40) ich weiß nie, welche Datei die Fehlermeldung erzeugt - es für immer zu finden, nimmt

.

UPDATE so yeh, können wir unsere STDERR ändern - ich hatte nur vergessen, dass ich brauche, um meinen println in meinem neuen STDERR außer Kraft setzen ... hier ist der entsprechende Code:

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

dann für jede Datei, die ich alles, was ich tun müssen, testen bin, ist, ändern errfile an den Dateinamen und meine Ausgabe herauskommt erwartet ...

Vielen Dank!

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob dies funktionieren wird, da, wie System.setErr funktioniert.

Ich würde eine neue Klasse erstellen, den Druckstrom erstreckt und überschreibt die Methoden, um Ihre Kommentare zu voranstellen. Dann stellen Sie den Fehlerstrom zu Ihrem neuen Printstream. Rufen Sie nicht System.err.printxxx aus dieser neuen Klasse.

ex ...

class PrependPrintStream extends PrintStream {

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

schaute ich in Print impl der Sonne, und es sieht aus wie alle printxxx Delegierten schreiben (String), die anstelle der geschützten privat ist. Ich denke, man kann Kopieren / Einfügen den Code.

EDIT ::

A viel bessere Lösung ist Protokollierung verwenden anstelle von System.err. Auf diese Weise können Sie deaktivieren und auf Ihre Aussagen und ermöglicht es Ihnen, eine benutzerdefinierte Fehlerbehandlungsroutine zu erstellen. Ihre spezifischen Handler könnte die Aussage, die Sie möchten die Zeichenfolge vor dem Drucken zu System.err voranstellen. Dies hat auch den Vorteil, dass nur Aussagen, die Ihren spezifischen Logger verwenden würden den vorangestellten Text und andere Anrufe System.err würde nicht.

Andere Tipps

Klingt wie Sie wahrscheinlich bei Aspect Oriented Programming (AOP) zu suchen. Mit AOP, können Sie einen Proxy an den Parser erstellen Sie anrufen. Vor dem Methodenaufruf thatGeneratesSTDERR () Sie können es Sie anrufen aufrufen. Von Ihrem Anruf können Sie die Ausgabe der gewünschten Informationen.

Beachten Sie, dass es ein bisschen zu lesen nehmen könnte zu verstehen, wie AOP funktioniert.

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

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

Sie können mit System.setErr umleiten stderr zu Ihrer eigenen Print.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top