java - обрабатывать исключение, выбрасываемое из библиотеки, останавливать печать на стандартный вывод - PullRequest
0 голосов
/ 23 октября 2018

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

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

Имеет ли это смысл, что это исключение заканчивается печатью на стандартный вывод?Потому что я получаю сообщения об ошибках на консоли при использовании библиотеки в тестах.

Я попытался перенаправить стандартный вывод примерно так:

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 голосов
/ 23 октября 2018

Это поведение JUnit для печати исключений, которые не перехвачены.Исключение должно быть перехвачено в Runnable.run(), который передается потоку или с Thread.setUncaughtExceptionHandler ()

Правильно ли я считаю, что вы наблюдаете такое поведение при запуске этого кода черезJUnit?Потому что в этом посте есть тег junit, но вы не упомянули его в своем вопросе.

0 голосов
/ 23 октября 2018

Почему бы не использовать 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);
...