2009-06-23 11 views
1

Есть ли способ, которым я могу поймать, когда метод генерирует запись в STDERR? Я пытаюсь предварительно отложить некоторую информацию при каждой записи STDERR.Как добавить информацию в STDERR, когда метод генерирует stderr?

скажем наш метод:

parser.thatGeneratesSTDERR(); 

он будет генерировать что-то вроде

линия 37:29 нет жизнеспособной альтернативы на характер «а»

я могу просто обернуть его с чем-то, что ловит stderr, чтобы быть написанным и предварительно отложить некоторую информацию , так что это будет выглядеть следующим образом:

Файл: mybadfile.txt - линия 37:29 нет жизнеспособной альтернативы в характере «в»

Я знаю, что я мог бы, вероятно, копаться фактический код, который делает STDERR писать, но я действительно не хочу сделайте это - я предпочел бы просто обернуть некоторый код вокруг этого метода.

Следует отметить, что этот метод не всегда генерирует STDERR - причина, по которой я пытаюсь их поймать, состоит в том, что он НЕ ДОЛЖЕН генерировать какой-либо STDERR, но поскольку это вызвано довольно большим количеством файлов (более 40). Я никогда не знаю, какой файл генерирует сообщение об ошибке - навсегда найти его.

UPDATE так Yeh, мы можем изменить наше STDERR - я просто забываю, что мне нужно переопределить мой Println в моем новом STDERR ... вот соответствующий код:

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

то для каждый файл, который я тестирую, все, что мне нужно сделать, это изменить errfile на имя файла, и мой вывод выходит из ожидаемого ...

спасибо большое!

+0

Я не уверен, является ли это хорошей практикой при принятии окончательного решения PrintStream. - Кажется, в вашем коде есть некоторые ошибки, так как я не мог заставить его работать. –

ответ

1

Я не уверен, что это сработает, учитывая, как работает System.setErr.

Я бы создал новый класс, который расширяет поток печати и перезаписывает методы для добавления комментария. Затем установите поток ошибок в новый поток печати. Не вызывайте System.err.printxxx из этого нового класса.

ex ...

class PrependPrintStream extends PrintStream { 

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

Я смотрел на солнечный PrintStream осущий, и это выглядит как все printxxx делегат писать (String), который является частным, а не защищено. Я думаю, вы можете скопировать/вставить код.

EDIT ::

гораздо лучшим решением является использование протоколирования вместо System.err. Это позволяет отключать и выполнять инструкции и позволяет создавать собственный обработчик ошибок. Ваш специальный обработчик мог бы добавить заявление, которое вы хотите передать, перед печатью в System.err. Это также имеет то преимущество, что только инструкции, которые используют ваш конкретный регистратор, будут иметь добавленный текст и другие вызовы System.err.

+0

yeh .. К сожалению, я нигде даже не рассматриваю вопрос в коде, который записывается в stderr .. Я просто хочу, чтобы он был переопределен, и теперь он работает - thnx – eyberg

1

Похоже, вы, вероятно, захотите взглянуть на Аспектно-ориентированное программирование (АОП). Используя AOP, вы можете создать прокси-сервер для вызываемого вами парсера. Перед вызовом метода thatGeneratesSTDERR() вы можете вызвать вызов. С вашего звонка вы можете вывести необходимую информацию.

Обратите внимание, что для понимания того, как работает АОП, может потребоваться немного чтения.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^