2009-06-23 56 views
1

当方法生成对STDERR的写入时,有什么方法可以捕获? 我试图预先将每个STDERR写入一些信息。当一个方法生成stderr时,我如何将信息添加到STDERR?

比方说,我们的方法是:

parser.thatGeneratesSTDERR(); 

它会产生类似

线在37:29没有性格可行的替代 'A'

可我只是把它包有些东西可以捕捉到stderr被写入并预先登录一些 信息,所以它会看起来像这样:

文件:mybadfile.txt - 线在37:29字符“一”

我知道我可以通过实际的代码,不会选择错误的写作,但我真的不想掏大概没有可行的替代方案这样做 - 我宁愿只是围绕此方法包装一些代码。

我应该注意到,这种方法并不总是生成STDERR--我试图捕捉它们的原因是它不应该生成任何STDERR - 但是因为这被称为相当多的文件(超过40)我永远不知道哪个文件正在产生错误消息 - 它需要永远找到。

UPDATE 所以叶,我们可以改变我们的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最终成为一个好习惯。 - 你的代码中似乎也有一些错误,因为我无法使它工作。 – 2009-10-21 22:55:52

回答

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 IMPL,它看起来像所有printxxx委托写(字符串),这是私人,而不是保护。我想你可以复制/粘贴代码。

编辑::

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

+0

yeh ..不幸的是,我甚至没有考虑钻入代码记录到stderr ..我只是想重写它现在的作品 - thnx – eyberg 2009-06-23 20:20:53

1

听起来像你可能想看看面向方面编程(AOP)。使用AOP,您可以为您正在调用的解析器创建代理。在方法调用GeneratesSTDERR()之前,你可以让它调用你的调用。从你的来电,你可以输出你想要的信息。

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

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

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

相关问题