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("---------------------------------");
}
我打印的行大多数时间都在堆栈跟踪的中间..
我的问题是为什么这种情况大多数时间都会发生?是否有更清洁的方法来避免这个问题?
答案 0 :(得分:4)
问题是堆栈跟踪被写入标准错误流,而您的行被写入标准输出流。替换为
e.printStackTrace();
System.err.println("---------------------------------");
或
e.printStackTrace(System.out);
System.out.println("---------------------------------");
在企业应用程序中,甚至比在客户端应用程序中更多,您不应该打印到标准流。使用像slf4j这样的真实日志框架,它允许您选择日志记录,目的地等级别。
答案 1 :(得分:1)
当Throwable.printStackTrace()
和System.out.println(Object)
写入不同的控制台(stderr
和stdout
)时,它们可能无法同步。
第一个提案:将错误写入stdout
:
e.printStackTrace(System.out);
或第二个提案:明确刷新stderr
缓冲区(并在第二个版本中使用它):
e.printStackTrace();
System.err.flush();
System.out.println(...);
答案 2 :(得分:1)
看起来“--------”介于打印的堆栈跟踪之间,因为异常打印在System.err
上,而“------”打印在{{1}上1}},但都打印到控制台。
所以这可能发生:
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("---------------------------------");