On Apr 9, 2013, at 9:30 AM, Zhong Yu <zhong.j...@gmail.com> wrote:

> 
> 
> 
> On Mon, Apr 8, 2013 at 6:54 PM, Steven Schlansker 
> <stevenschlans...@gmail.com> wrote:
> Today I encountered "java.lang.IllegalArgumentException: Self-suppression not 
> permitted" from Throwable.addSuppressed.
> 
> My first surprise is that the try-with-resources block can throw this 
> exception; it is very confusing to have auto-generated code throw exceptions. 
>  But beyond that, it is impossible to figure out *which* exception caused the 
> problem.  If you have multiple resources acquired in the try-with-resources, 
> it could be any of them.
> 
> Would it be reasonable to change
> 
>     public final synchronized void addSuppressed(Throwable exception) {
>         if (exception == this)
>             throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE);
> 
> to
> 
>     public final synchronized void addSuppressed(Throwable exception) {
>         if (exception == this)
>             throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, 
> this);
> 
> so that when you get this exception it at least points to one of the throw 
> sites that actually caused the problem?  Otherwise the only stack trace you 
> have is in auto-generated code and you are left scratching your head, 
> wondering where it came from.  I believe this would increase the 
> debuggability of the try-with-resources construct and there's no immediately 
> obvious downside.
> 
> I'm not the only one who was confused by this behavior:
> http://stackoverflow.com/questions/12103126/what-on-earth-is-self-suppression-not-permitted-and-why-is-javac-generating-co
> 
> 
> Reusing exception is probably not a good idea - unless the exception is 
> immutable, i.e. enableSuppression=writableStackTrace=true.
> 

I agree, but there is (library) code out there that does this -- the code that 
caused the problem wasn't even mine.  My suggestion has no cost unless you 
happen to trigger it, and then it helps you find who is causing trouble.

> Interestingly, even for an immutable exception, `e.addSuppressed(e)` isn't 
> allowed. I think that it should be allowed.
> 
> Zhong Yu

Reply via email to