.

One of the point in having exceptions that extends our own root
exception is that users at higher level can catch this top level.
Currently, we don't even advertise properly what we throw. We even
miss to forward upward some exceptions thrown at low level in the
javadoc/signature of out upper level methods.

So user may currently not know, only reading the javadoc/signature
of one of our implementation that they may get a MIAE or something
else. If we were using a single root,
Or just a single MathException.
  they would at least be able
to do a catch (MathRootException) that would prevent a runtime
exception to bubble up too far. Currently, defensive programming
to protect against this failure is to catch all of
MathArithmeticException, MathIllegalArgumentException,
MathIllegalNumberException, MathIllegalStateException,
MathUnsupportedOperationException, and MathRuntimeException.
With the design I proposed, and the design I'm using, we only have to catch 
one.  After it's caught the type code (Enum) indicates precisely what the issue 
is.

In a perfect world, we would be able to extend a regular IAE while
implementing a MathRootException, but Throwable in Java is a class,
not an interface. Too bad.
Luc - how do you feel about a single MathException that extends 
RuntimeException with an Enum that indicates what the root cause is and can be 
used as the key to look up the corresponding message template which can be 
resolved into a message using parameters attached to the MathException context?

Here's an example from my refactoring of ArithmeticUtils:

https://github.com/firefly-math/firefly-math-arithmetic/blob/master/src/main/java/com/fireflysemantics/math/arithmetic/Arithmetic.java

    /**
     * Add two integers, checking for overflow.
     *
     * @param x
     *            an addend
     * @param y
     *            an addend
     * @return the sum {@code x+y}
     * @throws MathException
     *             Of type {@code MAE__OVERFLOW_IN_ADDITION} if the result can
     *             not be represented as an {@code int}.
     */
    public static int addAndCheck(int x, int y) throws MathException {
        long s = (long) x
                + (long) y;
        if (s < Integer.MIN_VALUE
                || s > Integer.MAX_VALUE) {
            throw new MathException(MAE__OVERFLOW_IN_ADDITION).put(X, x).put(Y, 
y);
        }
        return (int) s;
    }

The toString() method of the exception is implemented like this and delivers 
the exception root cause (Enum) and parameter name and value pairs:

    @Override
    public String toString() {
        String parameters = context.entrySet().stream().map(e -> e.getKey()
                + "="
                + e.getValue()).collect(Collectors.joining(", "));

        return "Firefly math exception type "
                + this.type
                + ".  Context ["
                + parameters
                + "]";
    }

So we get a pretty good indication of what the issue is by just using 
toString() to construct the message.

Cheers,
Ole


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to