在Java中有没有更干净的方法来实现这一点?
我之所以使用这个嵌套的try-catch块,原因很简单,就是当我尝试这个在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
{
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("---------------------------------");