root cause finder

This commit is contained in:
Marcos Lopez Gonzalez 2019-04-15 20:47:23 +02:00 committed by mikr
parent 9e83dbbc85
commit c223b669be
2 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,61 @@
package com.baeldung.exceptions;
import java.util.Objects;
/**
* Utility class to find root cause exceptions.
*/
public class RootCauseFinder {
public static Throwable findCauseUsingPlainJava(Throwable throwable) {
Objects.requireNonNull(throwable);
Throwable rootCause = throwable;
while (rootCause.getCause() != null) {
rootCause = rootCause.getCause();
}
return rootCause;
}
static class IntParser {
private IntParser() {
}
public static int parse(String input) throws InvalidNumber {
if (input == null || input.isEmpty()) {
throw new IllegalArgumentException();
}
try {
return new IntParser().stringToInt(input.trim());
} catch (NaNException ex) {
throw new InvalidNumber(input, ex);
}
}
private int stringToInt(String numberAsString) throws NaNException {
try {
return Integer.valueOf(numberAsString);
} catch (NumberFormatException ex) {
throw new NaNException(numberAsString, ex);
}
}
}
static class InvalidNumber extends Exception {
InvalidNumber(String input, Throwable thr) {
super("Invalid input for a number: " + input, thr);
}
}
static class NaNException extends Exception {
NaNException(String number, Throwable thr) {
super(number + "is not a number", thr);
}
}
}

View File

@ -0,0 +1,51 @@
package com.baeldung.exceptions;
import com.google.common.base.Throwables;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.junit.jupiter.api.Test;
import static com.baeldung.exceptions.RootCauseFinder.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests the {@link RootCauseFinder}.
*/
public class RootCauseFinderTest {
@Test
public void givenNestedException_whenFindingRootCauseUsingJava_thenRootCauseFound() {
try {
IntParser.parse("text");
} catch (InvalidNumber ex) {
assertTrue(findCauseUsingPlainJava(ex) instanceof NumberFormatException);
}
}
@Test
public void givenNonNestedException_whenFindingRootCauseUsingJava_thenRootCauseFound() {
try {
IntParser.parse(null);
} catch (Exception ex) {
assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
}
}
@Test
public void givenNestedException_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
try {
IntParser.parse("text");
} catch (InvalidNumber ex) {
assertTrue(ExceptionUtils.getRootCause(ex) instanceof NumberFormatException);
}
}
@Test
public void givenNestedException_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
try {
IntParser.parse("text");
} catch (InvalidNumber ex) {
assertTrue(Throwables.getRootCause(ex) instanceof NumberFormatException);
}
}
}