Разница между printStackTrace() и toString()

Мне любопытно, какая разница между printStackTrace() и toString(). На первый взгляд, они кажутся, чтобы сделать то же самое.

код:

try {
// Some code
} catch (Exception e)
   e.printStackTrace();
   // OR
   e.toString()
}

Ответы

Ответ 1

Нет, есть важная разница! Используя toString, вы имеете только тип исключения и сообщение об ошибке. Используя printStackTrace(), вы получаете всю стекцию исключения, что очень полезно для отладки.

Пример System.out.println(toString()):

java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified)

Пример printStackTrace():

java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at java.io.FileReader.(FileReader.java:55)
at ReadFromFile.main(ReadFromFile.java:14)

Чтобы создать строку из всего stacktrace, я обычно использую этот метод:

public static String exceptionStacktraceToString(Exception e)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos);
    e.printStackTrace(ps);
    ps.close();
    return baos.toString();
}

Также обратите внимание, что просто вызов toString() просто возвращает строку и ничего не печатает.

Ответ 2

Чтобы преобразовать StackTrace в String, я использую более короткую реализацию:

public static String exceptionStacktraceToString(Exception e)
{
    return Arrays.toString(e.getStackTrace());
}

Ответ 3

Нет, там огромная разница. Если вы просто вызываете toString, он ничего не печатает - он просто вернет строку. Блок catch только e.toString(); бесполезен. (Там также вопрос трассировки стека, как указывал Мартийн.)

Лично я бы не использовал ни один из них: я бы использовал библиотеку протоколирования (log4j, java.util.logging и т.д.), которая сама принимает Throwable как параметр и будет отформатировать ее с пользой - включая трассировку стека, возможно, усечен, чтобы избежать повторения.

Ответ 4

toString () дает имя класса исключения, когда возникает исключение, и printStackTrace () дает иерархию записей выполнения метода, которые были там, когда исключение возбуждено в приложении.

Для кода

    try 
    {
        List<String>  n =new ArrayList<String>();
        String i = n.get(3); 
    }catch (Exception e) {
        e.printStackTrace();
    }
   }

e.printStackTrace() даст

java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at com.o2.business.util.Trial.test(CommonUtilsTest.java:866)

Пока e.toString() не будет печатать ничего, как написал Джон в своем ответе.

Ответ 5

Я думаю, что вы хотите получить результат Throwable.printStackTrace(), как и то, что я искал. Я проверил исходный код Java и собрал String вместо записи в PrintStream. Это несколько более полно, чем решение @MartijnCourteaux, но для меня это немного похоже на взлом.

Что касается вашего ответа, вы можете увидеть, что Throwable.toString() является только частью Throwable.printStackTrace():

public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}

Ответ 6

это то, что я использую для полной трассировки стека как String

public static @NotNull String toString(@NotNull Throwable e) {
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}

Ответ 7

Существует java-библиотека с открытым исходным кодом под названием MgntUtils (написанная мной), которая предоставляет несколько методов, которые позволяют извлекать трассировку стека в виде строки, а также при необходимости фильтровать на основе параметрического префикса пакета. См. Javadoc для метода public static java.lang.String getStacktrace (java.lang.Throwable e, логический cutTBS, java.lang.String релевантный пакет). Библиотека доступна в центральных Maven и Github.

Ответ 8

printStackStrace() дает 1) имя исключения 2) описание исключения. 3) Stackstrace. toString() 1) Имя исключения 2) Описание исключения getMessage() дает только описание исключения..... вот и все.