root cause finder
This commit is contained in:
parent
352e7ca9db
commit
cde706f8c9
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue