java-处理从库引发的异常,停止打印到stdout

时间:2018-10-23 14:53:54

标签: java exception junit console stdout

我正在使用一个创建线程的Java库,并且该线程内部有一个未捕获的Exception,该异常会传到stdout。

   try {
        Socket socket = server.accept();
        Thread t = new Thread(...);
        t.start();
    } catch (IOException e) {
        // Do noting
    }

这个异常最终被输出到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?

2 个答案:

答案 0 :(得分:0)

为什么不使用log4j,slf4j等?您可以按级别配置基于程序包的日志,然后将其写入所需或忽略的位置。您可以在上面定义任何配置

即使您从一开始就覆盖stdout和stderr(在主目录之上),也应该阻止它们进入控制台

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

答案 1 :(得分:0)

JUnit的行为是打印未捕获的异常。必须在传递到线程的Runnable.run()中或使用Thread.setUncaughtExceptionHandler()

捕获异常。

我是否认为您通过JUnit运行此代码时看到此行为是正确的?因为这篇文章带有junit标记,但是您在问题中没有提到它。