From f59f4c5c0fd4201e9e5a81ed26f853e99226725c Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Fri, 2 Oct 2015 08:19:07 +0200 Subject: [PATCH] [New] Added ExceptionHelper.getExceptionMessageWithCauses() and tests --- .../utils/helper/ExceptionHelper.java | 49 ++++++++++++------- .../utils/helper/ExceptionHelperTest.java | 46 +++++++++++++++++ 2 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 src/test/java/ch/eitchnet/utils/helper/ExceptionHelperTest.java diff --git a/src/main/java/ch/eitchnet/utils/helper/ExceptionHelper.java b/src/main/java/ch/eitchnet/utils/helper/ExceptionHelper.java index cfe5166dd..916489e71 100644 --- a/src/main/java/ch/eitchnet/utils/helper/ExceptionHelper.java +++ b/src/main/java/ch/eitchnet/utils/helper/ExceptionHelper.java @@ -40,6 +40,29 @@ public class ExceptionHelper { return StringHelper.isEmpty(t.getMessage()) ? t.getClass().getName() : t.getMessage(); } + /** + *

+ * Returns a message for the given {@link Throwable} + *

+ * + *

+ * A {@link NullPointerException} only has null as the message so this methods returns the class name + * in such a case + *

+ * + * @param t + * @return + */ + public static String getExceptionMessageWithCauses(Throwable t) { + + if (t.getCause() == null) { + return getExceptionMessage(t); + } + + String root = getExceptionMessageWithCauses(t.getCause()); + return getExceptionMessage(t) + "\n" + root; + } + /** * Formats the given {@link Throwable}'s stack trace to a string * @@ -64,24 +87,12 @@ public class ExceptionHelper { * @return a string representation of the given {@link Throwable}'s messages including causes */ public static String formatExceptionMessage(Throwable t) { - StringBuilder sb = new StringBuilder(); - sb.append(t.getMessage()); - appendCause(sb, t); - return sb.toString(); + + if (t.getCause() == null) { + return getExceptionMessage(t); + } + + String root = formatExceptionMessage(t.getCause()); + return getExceptionMessage(t) + "\ncause:\n" + root; } - - private static void appendCause(StringBuilder sb, Throwable e) { - Throwable cause = e.getCause(); - if (cause == null) - return; - - sb.append("\n"); - - sb.append("cause:\n"); - sb.append(cause.getMessage()); - - if (cause.getCause() != null) - appendCause(sb, cause.getCause()); - } - } diff --git a/src/test/java/ch/eitchnet/utils/helper/ExceptionHelperTest.java b/src/test/java/ch/eitchnet/utils/helper/ExceptionHelperTest.java new file mode 100644 index 000000000..eba21340e --- /dev/null +++ b/src/test/java/ch/eitchnet/utils/helper/ExceptionHelperTest.java @@ -0,0 +1,46 @@ +package ch.eitchnet.utils.helper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class ExceptionHelperTest { + + @Test + public void shouldGetExceptionMsg() { + + Exception e = nestedException(); + assertEquals("Third", ExceptionHelper.getExceptionMessage(e)); + assertEquals("Third\nSecond\nFirst", ExceptionHelper.getExceptionMessageWithCauses(e)); + } + + @Test + public void shouldFormatException() { + + Exception e = nestedException(); + String formatException = ExceptionHelper.formatException(e); + assertTrue(formatException.contains("java.lang.RuntimeException: First")); + assertTrue(formatException.contains("java.lang.RuntimeException: Second")); + assertTrue(formatException.contains("java.lang.RuntimeException: Third")); + + formatException = ExceptionHelper.formatExceptionMessage(e); + assertEquals("Third\ncause:\nSecond\ncause:\nFirst", formatException); + } + + private Exception nestedException() { + try { + try { + try { + throw new RuntimeException("First"); + } catch (Exception e) { + throw new RuntimeException("Second", e); + } + } catch (Exception e) { + throw new RuntimeException("Third", e); + } + } catch (Exception e) { + return e; + } + } +}