ARM and repeating exceptions

Joseph Darcy joe.darcy at oracle.com
Tue May 29 19:10:49 PDT 2012


Hello Aleksey,

On 5/23/2012 9:01 AM, Aleksey Shipilev wrote:
> Hi Joe,
>
> On Wed, May 23, 2012 at 7:03 PM, Joe Darcy<joe.darcy at oracle.com>  wrote:
>> etc., define precisely what try-with-resources means.  This meaning does not
>> support the usage pattern you have brought up.
> I can see that. However, the rules for good language design dictates
> the orthogonal features of the language should inter-operate. Are you
> saying that current try-wth-resources spec prohibits throwing the
> *same* (literally, the same) exception from close()? Would you care to
> state that explicitly in AutoCloseable javadoc?

It is not prohibited, it just causes an exception ;-)  The behavior you 
have reported is required by the current specification.  However, I do 
not think elaborating on this point is worthwhile in the AutoCloseable 
javadoc since I think this situation will be a rare occurrence in 
practice and an explicit note about it would tend to nearly always 
distract rather than inform.

>
>> The the Project Coin/JSR 334 effort took pains to include javadoc for
>> Throwable.addSuppressed to discuss the difference between caused by and
>> suppressed:
> Yes, I had read that paragraph through even before the first reply.
> Arguably, that paragraph tells you nothing about the behavior when the
> secondary exception is equal()-ly the same. It does not really tell
> you can get IllegalArgumentException out of thin air when using
> try-with-resources. I would say that is the blind spot of the spec,
> and I would strongly encourage us to do least astonishing thing in
> that blind spot.
>
>> The desugaring of try-with-resource in your code occurs "inside" the try
>> block and does not include the catch IOException.  In other words, the
>> implicit call to close is logically inside the try {...}catch.  Therefore,
>> your code as written tries to have an exception suppress itself, which is
>> rejected by the library code as documented.
> The trouble is not about "rejected by the library code". The trouble
> is surprising exception at the runtime. By the way, that surprising
> IllegalArgumentException even masks the original one, thus
> *completely* defeating the purpose of addSuppressed(). That becomes
> refreshingly funny when the exception throwing code is the 3rd party
> library code which users are "safely" using with try-with-resources.
>
> This had already happened in real project. Fixing this glitch with
> null-check will help this corner case without compromising the usual
> behavior. As much as I love following specs to the ground, arguing
> about safe change because you can't yet have simple correction to the
> spec (why oh why the concrete desugaring code is the part of
> not-really-changeable spec anyway?) feels too ivory-towerish for me.
>
> -Aleksey.

The semantics of the try-with-resources feature are tightly specified, 
as are the semantics of other language features.  Try with resources is 
specified in terms of a desugaring, as is the for-each loop from JDK 5.  
Early implementations of try-with-resources were available well ahead of 
JDK 7 shipping and developers were explicitly encouraged to try out 
try-with-resources and give feedback. [1]  Based on usage of the feature 
and feedback sent to coin-dev and elsewhere, the try-with-resources 
handling of null was adjusted before JDK 7 shipped. [2]

-Joe

[1] https://blogs.oracle.com/darcy/entry/project_coin_try_out_try
[2] https://blogs.oracle.com/darcy/entry/project_coin_null_try_with



More information about the compiler-dev mailing list