我使用的是一个java库,它创建了一个线程,线程内部有一个未捕获的异常,该异常转到stdout。
try {
Socket socket = server.accept();
Thread t = new Thread(...);
t.start();
} catch (IOException e) {
// Do noting
}
这个异常最终被打印到stdout,这有意义吗?因为在测试中使用该库时,我会将错误打印到控制台。
我尝试使用如下内容重定向stdout:
PrintStream original = System.out;
System.setOut(new PrintStream(new OutputStream() {
public void write(int b) {
//DO NOTHING
}
}));
它不起作用..我认为这与在库中运行的线程抛出的异常有关。
如何才能禁止其进入控制台?或者将其重定向到其他地方?
编辑:
显然,打印异常是因为它们转到了System.err,我在junit类中做了类似这样的事情
static { System.setErr(new PrintStream(new OutputStream() { public void write(int b) { } })); }
并停止将异常打印到控制台。
我想要的是只禁用来自特定包的System.err。
有没有可能呢?也许使用log4j2.xml?
发布于 2018-10-23 23:05:36
为什么不使用log4j、slf4j等?您可以按级别配置基于包的日志,并将其写入您想要或忽略的位置。您可以在其上定义任何配置
即使是ff,你也会从一开始就覆盖stdout和stderr (在main之上),这应该会阻止它们进入控制台。
PrintStream printStream4StoppingStdOutAndErr = new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
//I am stopper for any out writer
}
});
System.setOut(printStream4StoppingStdOutAndErr);
System.setErr(printStream4StoppingStdOutAndErr);
发布于 2018-10-23 23:11:19
打印未捕获的异常是JUnit的行为。必须在传递给线程或使用Thread.setUncaughtExceptionHandler()的Runnable.run()
内捕获异常
我认为您在通过JUnit运行这段代码时看到了这种行为,我这样想对吗?因为这篇文章有junit标签,但你在问题中没有提到它。
https://stackoverflow.com/questions/52952064
复制相似问题