当方法生成对STDERR的写入时,是否有某些方法可以捕获? 我试图在每次STDERR写入时预先附上一些信息。

让我们说我们的方法是:

parser.thatGeneratesSTDERR();

它会产生类似

的东西

第37:29行没有可行的替代字符'a'

我可以用一些能够抓住要写入的stderr的东西来包裹它并预先安装一些 信息,所以它看起来像这样:

档案:mybadfile.txt - 第37:29号字符“a”

没有可行的选择

我知道我可能会深入研究执行STDERR编写的实际代码,但我真的不想这样做 - 我宁愿只是围绕这个方法包装一些代码。

我应该注意,这个方法并不总是生成STDERR - 我试图捕获它们的原因是它不应该生成任何STDERR - 但是因为这是在很多文件上调用的(在40)我永远不知道哪个文件正在生成错误消息 - 需要永远查找。

<强>更新 所以,我们可以改变我们的STDERR - 我只是忘记了我需要在我的新STDERR中覆盖我的println ...这里是相关的代码:

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的PrintStream impl,看起来所有printxxx委托写(String)是私有的而不是protected。我想你可以复制/粘贴代码。

EDIT ::

很多更好的解决方案是使用Logging而不是System.err。这允许您关闭和打开语句,并允许您创建自定义错误处理程序。在打印到System.err之前,您的特定处理程序可以在字符串之前添加您希望的语句。这样做的另一个好处是,只有使用特定记录器的语句才会有前置文本,而对System.err的其他调用则不会。

其他提示

听起来你可能想看看面向方面编程(AOP)。使用AOP,您可以为要调用的解析器创建代理。在方法调用thatGeneratesSTDERR()之前,您可以调用它来调用。通过电话,您可以输出所需的信息。

请注意,了解AOP的工作原理可能需要一些阅读。

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

AOP联盟 - http://sourceforge.net/projects/aopalliance

你可以使用 System.setErr 将stderr重定向到您自己的PrintStream。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top