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