Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中有没有更干净的方法来实现这一点?_Java_Exception_Exception Handling_Try Catch_Catch Block - Fatal编程技术网

在Java中有没有更干净的方法来实现这一点?

在Java中有没有更干净的方法来实现这一点?,java,exception,exception-handling,try-catch,catch-block,Java,Exception,Exception Handling,Try Catch,Catch Block,我之所以使用这个嵌套的try-catch块,原因很简单,就是当我尝试这个 try { try { function(a, b); } catch (Exception e) { e.printStackTrace(); throw e; } } catch (Exception e) { System.out.println("---------------------------------

我之所以使用这个嵌套的try-catch块,原因很简单,就是当我尝试这个

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

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


我的问题是为什么这种情况经常发生?有没有更干净的方法来避免这个问题?

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

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

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

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

作为可丢弃的.printStackTrace()和
系统.out.println(对象)
写入不同的控制台(
stderr
stdout
),它们可能不会同步

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

e.printStackTrace(System.out);
System.out.println("---------------------------------");
或者第二个建议:显式刷新
stderr
缓冲区(并像在第二个变体中一样使用它):

由于异常在
System.err
上打印,而“------”在
System.out
上打印,但两者都打印到控制台,因此打印的堆栈跟踪之间似乎有“----------”字样

e.printStackTrace();
System.err.flush();
System.out.println(...);
所以这可能发生:

  • e.printStackTrace()
    将所有内容打印到
    System.err
    ,但并非所有内容都立即刷新到控制台
  • System.out.println(“--------------”
    将“----”打印到
    System.out
    并立即刷新它
  • 系统的其余部分。err
    现在被刷新
  • 如果希望
    System.err
    System.out
    在控制台中按顺序显示,请在使用
    System.out
    之前刷新错误流

    e.printStackTrace();
    System.err.flush();
    System.out.println(...);
    
    或者将错误流用于两者

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

    问题是什么O.,你的第一部分显示了冗余。我打印的行大部分出现在堆栈跟踪的中间。这是一行代码,它使用EJB框架在Java企业环境中运行,第二个代码大部分时间在跟踪堆栈中打印该行,如
    e.printStackTrace()
    System.out..
    不按顺序执行e.printStackTrace();输出至标准误差,System.out.println输出至标准输出。尝试更改为System.err.println(“----”<代码>因不清楚而关闭因此充满了笑话
    e.printStackTrace();
    System.err.println("---------------------------------");