RFR: jsr166 jdk9 integration wave 2
Peter Levart
peter.levart at gmail.com
Wed Nov 25 08:05:44 UTC 2015
On 11/25/2015 01:59 AM, Martin Buchholz wrote:
>
>
> On Tue, Nov 24, 2015 at 2:30 PM, Peter Levart <peter.levart at gmail.com
> <mailto:peter.levart at gmail.com>> wrote:
>
>
> What do you think of exception cloning?
>
>
> Making copies of java objects has historically been troublesome (e.g.
> Cloneable). I have made clones of objects often in tests via
> deserialization + reserialization, but never in serious code. So I'm
> hesitant. We could try to make the serial clone + addSuppressed, and
> fall back to the original exception in case of failure. This might
> work well in practice. We might also discover lots of latent
> serialization bugs in exceptions. Has decades of RMI caught most of
> the problems with this approach? Can we have a serialization expert
> bless this?
>
I was only thinking of Cloneable. Serialization is troublesome. If
Throwable was retrofitted to implement Cloneable and have the following
new static method:
/**
* {@link Object#clone() Clones} given {@code exception} and
returns it's clone which
* shares all state with original exception (shallow clone) except
for the possible list of already
* {@link #addSuppressed(Throwable) added} {@link #getSuppressed()
suppressed}
* exceptions. The suppressed exception instances are not cloned,
just the
* list containing them. Further {@link #addSuppressed(Throwable)
additions}
* to the suppressed exceptions of the returned clone instance
* don't affect the suppressed exceptions of original exception and
vice versa.
*
* @param exception the exception to clone.
* @param <T> the type of exception
* @return shallow clone of given exception with suppressed exception
* list shallow-cloned
* @since 1.9
*/
@SuppressWarnings("unchecked")
public static <T extends Throwable> T clone(T exception) {
try {
Throwable clone = (Throwable) exception.clone();
if (clone.suppressedExceptions != null &&
clone.suppressedExceptions != SUPPRESSED_SENTINEL) {
clone.suppressedExceptions = new
ArrayList<>(clone.suppressedExceptions);
}
return (T) clone;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
...then would you prefer using it or would you nevertheless prefer
swapping the roles of exceptions in whenComplete?
Regards, Peter
More information about the core-libs-dev
mailing list