e.printStackTrace和System.out.println(e)之间的区别

imu*_*ion 28 java exception-handling exception

可能是一个新手问题,但每个人似乎都在使用e.printStackTrace(),但我总是System.out.println(e)在异常处理时使用.有什么区别,为什么e.printStackTrace()更好?

ass*_*ias 38

使用的输出流与@Brian指出的输出流不同,但细节水平也不相同 - 您可以尝试下面的简单测试.输出:

使用println:您只知道抛出了什么异常

java.lang.UnsupportedOperationException:尚未实现

使用printStackTrace:你也知道它是什么原因造成的(行号+调用栈)

java.lang.UnsupportedOperationException:尚未
在javaapplication27.Test1.main
(Test1.java:27)javaapplication27.Test1.main (Test1.java:19)中实现

public static void main(String[] args){
    try {
        test();
    } catch (UnsupportedOperationException e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

private static void test() {
    throw new UnsupportedOperationException("Not yet implemented");
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*new 7

如果您使用System.out.println,那么您将错误转储给stdout,而不是stderr.

将错误转储到标准错误是很传统的,因此您可以从错误输出中过滤正常的成功输出.这是命令行实用程序的常见做法,因此是一个好主意.

例如

myCommand 2> /tmp/errors > /tmp/results
Run Code Online (Sandbox Code Playgroud)

将错误写入一个日志,结果写入另一个日志.根据你的shell /调用过程等,你可以结合这些信息,抛出错误,如果发生任何错误就会做出反应等.有关详细信息,请参阅此处.

使用printStackTrace()是一个好主意,因为你正在倾销异常发生的地方.这通常对于跟踪意外错误非常有用,因为它会为您提供直接(如果详细)指针,指向您遇到错误的位置.


sli*_*lim 6

System.out.println(e)相当于System.out.println(e.toString())System.out是一个 PrintStream,PrintStream.println(Object o)调用PrintStream.println(o.toString()).

e.toString() 返回类的名称和异常的 getLocalizedMessage()。

e.printStackTrace()写入该信息到System.err的(未System.out的)和栈跟踪,即,导致该异常的方法的链。这是有用的信息。

我经常认为如果有一种方法可以返回一个包含由e.printStackTrace(). 由于您不必使用e.getStackTrace()和编写自己的例程来输出 StackTraceElements 的结果数组。