Есть ли более чистый способ сделать это в Java try-catch?

try
{
    try
    {
        function(a, b);
    }
    catch (Exception e)
    {
        e.printStackTrace();
        throw e;
    }
}
catch (Exception e)
{
    System.out.println("---------------------------------");
}

Я делаю этот вложенный блок try-catch по причине, которая заключается в том, что когда я пытаюсь это сделать

try
{
    function(a, b);
}
catch (Exception e)
{
    e.printStackTrace();
    System.out.println("---------------------------------");
}

Строка, которую я печатаю, находится в середине трассировки стека большую часть времени..

Мой вопрос: почему это происходит чаще всего? и есть ли более чистый способ избежать этой проблемы?

3 ответа

Решение

Проблема в том, что трассировка стека записывается в стандартный поток ошибок, а ваша строка записывается в стандартный поток вывода. Заменить его на

e.printStackTrace();
System.err.println("---------------------------------");

или

e.printStackTrace(System.out);
System.out.println("---------------------------------");

В корпоративном приложении даже больше, чем в клиентском приложении, вы все равно не должны печатать в стандартные потоки. Используйте реальную структуру ведения журнала, такую ​​как slf4j, которая позволит вам выбирать уровни ведения журнала, места назначения и т. Д.

Как Throwable.printStackTrace() а также System.out.println(Object) пиши на разные консоли (stderr а также stdout), они не могут быть синхронизированы.

1-е предложение: напишите ошибку в stdout:

e.printStackTrace(System.out);

или 2-е предложение: явно очистить stderr буфер (и используйте его как во втором варианте):

e.printStackTrace();
System.err.flush();
System.out.println(...);

Похоже, что "--------" находится между напечатанной трассировкой стека, потому что исключение печатается на System.err в то время как "------" напечатан на System.out, но оба печатают на консоль.

Так что это может произойти:

  1. e.printStackTrace() печатает все для System.err, но не все сразу сбрасываются на консоль.
  2. System.out.println("--------------") печатает "----" для System.out и сразу же сбрасывает его.
  3. остаток от System.err сейчас покраснел

Очистить поток ошибок перед использованием System.out если ты хочешь System.err а также System.out появляться в последовательности в консоли.

e.printStackTrace();
System.err.flush();
System.out.println("---------------------------------");

или используйте поток ошибок для обоих

e.printStackTrace();
System.err.println("---------------------------------");
Другие вопросы по тегам