【问题标题】:Is there a cleaner way to do this in Java try-catch? [closed]在 Java try-catch 中有没有更简洁的方法来做到这一点? [关闭]
【发布时间】:2013-12-16 07:22:30
【问题描述】:
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("---------------------------------");
}

我打印的行大部分时间都在堆栈跟踪的中间..

我的问题是为什么大多数时候会发生这种情况?有没有更简洁的方法来避免这个问题?

【问题讨论】:

  • 有什么问题? :O。您的第一部分显示了冗余。
  • 我打印的行大部分时间都在堆栈跟踪的中间。这是我的行
  • 这段代码在使用 EJB 框架的 Java 企业环境中运行,第二个代码大部分时间打印跟踪堆栈内的行,就像 e.printStackTrace()System.out.. 不是按顺序执行的那样跨度>
  • e.printStackTrace();输出到标准错误和 System.out.println 到标准输出。尝试更改为 System.err.println("------");
  • closed as unclear 简直是笑话

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


【解决方案1】:

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

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

或到

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

在企业应用程序中甚至比在客户端应用程序中,您也不应该打印到标准流。使用真正的日志框架,如 slf4j,它允许您选择日志级别、目的地等。

【讨论】:

    【解决方案2】:

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

    第一个建议:将错误写入stdout

    e.printStackTrace(System.out);
    

    或第二个建议:显式刷新stderr 缓冲区(并像在第二个变体中一样使用它):

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

    【讨论】:

      【解决方案3】:

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

      所以这可能发生:

      1. e.printStackTrace() 将所有内容打印到System.err,但并非所有内容都立即刷新到控制台。
      2. System.out.println("--------------") 将“----”打印到 System.out 并立即刷新它。
      3. System.err 的其余部分现在已刷新

      如果您希望System.errSystem.out 在控制台中按顺序出现,请在使用System.out 之前刷新错误流。

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

      或两者都使用错误流

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-13
        • 2011-06-28
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多