On OutputStream I do a flush() explicitly in the try block instead of relying on close() to do the buffer flush.
The finally() block then does the close() and swallows the close() exception. If there was a problem on the flush() then the exception will be caught in the catch() block and will be plain to see without having been swallowed. --Roger On Jun 2, 10:07 pm, Mark Hibberd <mthibb...@gmail.com> wrote: > On Wed, Jun 3, 2009 at 12:55 PM, Christian Catchpole > > <christ...@catchpole.net> wrote: > > > Yeah, this can be a problem. Perhaps the neatest way is to do > > something like this.. use a static helper which eats the exception. > > > OutputStream os = new BlahOutputStream(); > > try { > > // do stuff hyar, hyar and hyar.. > > os.write( stuff ); > > } finally { > > StreamHelperThingy.closeDontThrow(os); > > } > > That is probably ok for an InputStream but it is definitely not for > an OutputStream. If there is buffering going on, flush will get called > via the close method, triggering an exception and your data would not > have been written. With your example you would never find that out. > > You only want to swallow an exception thrown from close if there was > an exception from the try. I would recommend writing something like: > > class WithOutputStream { > public static <T> T blah(UsingOutputStream<T> action) { > OutputStream os = new BlahOutputStream(); > } > > } > > class > > > On Jun 3, 10:01 am, Tim <javaposse.t...@spamgourmet.com> wrote: > >> In Joshua Bloch's Automatic Resource Management proposal > >> (http://docs.google.com/Doc?id=ddv8ts74_3fs7483dp) for project Coin he > >> wrote: > > >> Even the "correct" idioms for manual resource management are > >> deficient: > >> if an exception is thrown in the try block, and another when > >> closing the > >> resource in the finally block, the second exception supplants the > >> first, making it difficult to determine the real cause of the > >> trouble. > >> In other words, by responsibly closing your resource even during > >> some > >> catastrophic event, you can actually erase all record of the > >> event, > >> resulting in many wasted hours of debugging. While it is possible > >> to > >> write code to suppress the second exception in favor of the first, > >> virtually no one does, as it is just too verbose. This is not a > >> theoretical problem; it has greatly complicated the debugging of > >> large > >> systems. > > >> I just encountered this problem: Some code threw an exception creating > >> a zip. > >> The ZipOutputStream was closed in a finally block and the real > >> exception > >> was replaced by one complaining that there were no entries in the zip. > > >> Does anyone do the "right" thing? What are the best idioms or helper > >> methods/classes to do this? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "The Java Posse" group. To post to this group, send email to javaposse@googlegroups.com To unsubscribe from this group, send email to javaposse+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/javaposse?hl=en -~----------~----~----~----~------~----~------~--~---