在Java try-catch中有更简洁的方法吗?

时间:2013-12-16 07:22:31

标签: java exception exception-handling try-catch catch-block

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 个答案:

答案 0 :(得分:4)

问题是堆栈跟踪被写入标准错误流,而您的行被写入标准输出流。替换为

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

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

在企业应用程序中,甚至比在客户端应用程序中更多,您不应该打印到标准流。使用像slf4j这样的真实日志框架,它允许您选择日志记录,目的地等级别。

答案 1 :(得分:1)

Throwable.printStackTrace()System.out.println(Object)写入不同的控制台(stderrstdout)时,它们可能无法同步。

第一个提案:将错误写入stdout

e.printStackTrace(System.out);

或第二个提案:明确刷新stderr缓冲区(并在第二个版本中使用它):

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

答案 2 :(得分:1)

看起来“--------”介于打印的堆栈跟踪之间,因为异常打印在System.err上,而“------”打印在{{1}上1}},但都打印到控制台。

所以这可能发生:

  1. System.out将所有内容打印到e.printStackTrace(),但并非所有内容都立即刷新到控制台。
  2. System.err将“----”打印到System.out.println("--------------")并立即将其刷新。
  3. System.out的其余部分现已刷新
  4. 如果您希望System.errSystem.out在控制台中按顺序出现,请在使用System.err之前刷新错误流。

    System.out

    或使用错误流

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