Есть ли более чистый способ сделать это в 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
, но оба печатают на консоль.
Так что это может произойти:
e.printStackTrace()
печатает все дляSystem.err
, но не все сразу сбрасываются на консоль.System.out.println("--------------")
печатает "----" дляSystem.out
и сразу же сбрасывает его.- остаток от
System.err
сейчас покраснел
Очистить поток ошибок перед использованием System.out
если ты хочешь System.err
а также System.out
появляться в последовательности в консоли.
e.printStackTrace();
System.err.flush();
System.out.println("---------------------------------");
или используйте поток ошибок для обоих
e.printStackTrace();
System.err.println("---------------------------------");