Hi Damjan, Damjan Jovanovic wrote:
> On Fri, Oct 25, 2013 at 12:36 PM, Jörg Schaible > <joerg.schai...@scalaris.com> wrote: >> Hi Damjan, >> >> Damjan Jovanovic wrote: >> >> [snip] >> >> Thanks for explanation. >> >>> We would be able to adapt that for Java < 1.7 by swallowing the close >>> exception instead of calling addSuppressed() on the primary exception, >>> but the show stopper is catching and rethrowing the primary exception >>> (Throwable), which javac < 1.7 refuses to compile because it doesn't >>> do "Rethrowing Exceptions with More Inclusive Type Checking" >>> (http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html). >>> >>> But this would work and always sets succeeded correctly without >>> catch/re-throw: >>> >>> final InputStream is = factoryMethodThatCanThrow(); >>> boolean succeeded = false; >>> try { >>> try { >>> is.methodThatCanThrow(); >>> } finally { >>> } >>> succeeded = true; >>> } finally { >>> closeSafely(!succeeded, is); >>> } >> >> I guess the nested try was unintentionally ;-) >> >> Cheers, >> Jörg > > Well that actually won't work, because the "succeeded = true;" will be > skipped if there is a "return;" in the inner try. Well, but this has to be done in our code, so we can either change it or set "succedded = true" before the return as well. To mimic Java 7, we could also implement: ============= %< =============== Throwable t = null; try { } (catch IOException e) { t = e; throw e; } // ... another line for each checked exception } (catch RuntimeException e) { t = e; throw e; } } (catch Error e) { t = e; throw e; } } finally { closeSafely(t != null, is); } ============= %< =============== but as commented, we have to add a catch for every checked exception, anotehr one for RuntimeException and one for Error. The approach with the succeeded flag seems easier ... > Other than a custom Java compiler, I guess there's no clean way of > doing this in Java < 1.7. There's really only option 2 - with being > careful to always set succeeded correctly on all paths out of the try > block. Almost like releasing memory in C. Yep. Cheers, Jörg --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org