Как мне добавить информацию в STDERR, когда метод генерирует stderr?

StackOverflow https://stackoverflow.com/questions/1034536

Вопрос

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

допустим, наш метод таков:

parser.thatGeneratesSTDERR();

это сгенерирует что-то вроде

строка 37:29 нет жизнеспособной альтернативы символу "а"

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

Файл:mybadfile.txt -- строка 37:29 нет жизнеспособной альтернативы символу "а"

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

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

Обновить итак, да, мы можем изменить наш 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 на имя файла, и мой результат будет ожидаемым...

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

Это было полезно?

Решение

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

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

бывший...

class PrependPrintStream extends PrintStream {

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

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

Редактировать::

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

Другие советы

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

Обратите внимание, что может потребоваться немного чтения, чтобы понять, как работает AOP.

Аспект j - http://www.eclipse.org/aspectj/

Альянс АОП - http://sourceforge.net/projects/aopalliance

Вы можете использовать System.setErr Система.setErr перенаправить stderr в ваш собственный поток печати.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top