提交 da541716 编写于 作者: J Jesse Glick

Handle suppressed exceptions.

上级 106bd3e0
......@@ -1453,16 +1453,21 @@ public class Functions {
return Messages.Functions_NoExceptionDetails();
}
StringBuilder s = new StringBuilder();
doPrintStackTrace(s, t, null);
doPrintStackTrace(s, t, null, "");
return s.toString();
}
private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher) {
private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix) {
// TODO check if t overrides printStackTrace
// TODO handle suppressed exceptions
Throwable lower = t.getCause();
if (lower != null) {
doPrintStackTrace(s, lower, t);
s.append("Caused: ");
doPrintStackTrace(s, lower, t, prefix);
}
for (Throwable suppressed : t.getSuppressed()) {
s.append(prefix).append("Also: ");
doPrintStackTrace(s, suppressed, t, prefix + "\t");
}
if (lower != null) {
s.append(prefix).append("Caused: ");
}
String summary = t.toString();
if (lower != null) {
......@@ -1485,7 +1490,7 @@ public class Functions {
}
}
for (int i = 0; i < end; i++) {
s.append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR);
s.append(prefix).append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR);
}
}
......
......@@ -454,12 +454,54 @@ public class FunctionsTest {
"\tat ......remote call(Native Method)\n" +
"\tat local.Side.call(Side.java:11)\n" +
"\tat local.Main.main(Main.java:1)\n");
// Suppressed exceptions:
assertPrintThrowable(new Stack("java.lang.IllegalStateException: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1").
cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")).
suppressed(new Stack("java.io.IOException: could not close", "p.C.close:99", "p.C.method1:18", "m.Main.main:1"),
new Stack("java.io.IOException: java.lang.NullPointerException", "p.C.flush:77", "p.C.method1:18", "m.Main.main:1").
cause(new Stack("java.lang.NullPointerException", "p.C.findFlushee:70", "p.C.flush:75", "p.C.method1:18", "m.Main.main:1"))),
"java.lang.IllegalStateException: java.lang.NullPointerException: oops\n" +
"\tat p.C.method1(C.java:19)\n" +
"\tat m.Main.main(Main.java:1)\n" +
"\tSuppressed: java.io.IOException: could not close\n" +
"\t\tat p.C.close(C.java:99)\n" +
"\t\tat p.C.method1(C.java:18)\n" +
"\t\t... 1 more\n" +
"\tSuppressed: java.io.IOException: java.lang.NullPointerException\n" +
"\t\tat p.C.flush(C.java:77)\n" +
"\t\tat p.C.method1(C.java:18)\n" +
"\t\t... 1 more\n" +
"\tCaused by: java.lang.NullPointerException\n" +
"\t\tat p.C.findFlushee(C.java:70)\n" +
"\t\tat p.C.flush(C.java:75)\n" +
"\t\t... 2 more\n" +
"Caused by: java.lang.NullPointerException: oops\n" +
"\tat p.C.method2(C.java:23)\n" +
"\tat p.C.method1(C.java:17)\n" +
"\t... 1 more\n",
"java.lang.NullPointerException: oops\n" +
"\tat p.C.method2(C.java:23)\n" +
"\tat p.C.method1(C.java:17)\n" +
"Also: java.io.IOException: could not close\n" +
"\t\tat p.C.close(C.java:99)\n" +
"\t\tat p.C.method1(C.java:18)\n" +
"Also: java.lang.NullPointerException\n" +
"\t\tat p.C.findFlushee(C.java:70)\n" +
"\t\tat p.C.flush(C.java:75)\n" +
"\tCaused: java.io.IOException\n" +
"\t\tat p.C.flush(C.java:77)\n" +
"\t\tat p.C.method1(C.java:18)\n" +
"Caused: java.lang.IllegalStateException\n" +
"\tat p.C.method1(C.java:19)\n" +
"\tat m.Main.main(Main.java:1)\n");
}
private static void assertPrintThrowable(Throwable t, String traditional, String custom) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
assertEquals(sw.toString().replace(IOUtils.LINE_SEPARATOR, "\n"), traditional);
assertEquals(Functions.printThrowable(t).replace(IOUtils.LINE_SEPARATOR, "\n"), custom);
String actual = Functions.printThrowable(t);
System.out.println(actual);
assertEquals(actual.replace(IOUtils.LINE_SEPARATOR, "\n"), custom);
}
private static final class Stack extends Throwable {
private static final Pattern LINE = Pattern.compile("(.+)[.](.+)[.](.+):(\\d+)");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册