New protocol for disabling exception suppression
joe.darcy at oracle.com
Sun Apr 3 22:31:44 PDT 2011
Rémi Forax wrote:
> On 04/02/2011 03:21 AM, joe.darcy at oracle.com wrote:
>> As part of the library support for the try-with-resources statement,
>> several API changes were made to Throwable including an addSuppressed
>> method to allow suppressed exceptions to be recorded. As previously
>> discussed on coin-dev , to support VM needs for reusable exception
>> objects, a protocol was devised to disable the suppression mechanism so
>> that a zero-length array would be returned from getSuppressed even if
>> addSuppressed was called with a valid argument. The mechanism was a bit
>> of a kludge, relying on an initial call to addSuppressed with a null
>> argument, and the design was called out as such.  I'm happy to report
>> the JSR 334 expert group has devised a more elegant protocol to disable
>> exception suppression: a new constructor is added to Throwable which
>> supports disabling suppression. The existing constructors of Throwable
>> always enable suppression and addSuppressed(null) now always throws a
>> NullPointerException. A few exception and error types in the platform
>> are allowed by behave as if their objects were created with suppression
>> The fix was recently pushed  and will appear in a future JDK 7 build.
> Reading the corresponding javadoc,
> I've found that the constructor is protected.
That was intentional.
> In my opinon, it should
> be public. All the other constructors are public, you can instantiate
> a Throwable but if you want a Throwable that don't store
> suppressed exceptions, you have to subclass it.
> I don't understand the rational of this decision.
Disabling suppression is a niche capability. It does not need to be
made as easy to use as other capabilities of Throwable. If a need
arises to make the new constructor public, that can be done compatibly
in a future release.
More information about the coin-dev