On Jun 4, 5:25 am, Reinier Zwitserloot <reini...@gmail.com> wrote:
> Dominic: That is -extremely- bad and buggy code. NEVER use that, ever.
>
> The problem is this:
>
> If the try block does NOT throw an exception, but the close method
> DOES, then you should not swallow that exception like closeDontThrow()
> supposedly does. Remember, some outputstreams buffer; odds are that no
> actual I/O takes place until you call the close() method!
>
> It's acceptable to swallow *INPUTSTREAM*'s close method's IOException,
> not so much because you can safely ignore that exception, but more
> because it never gets thrown anyway, so its a moot point. Rethrowing
> as a RuntimeException (throw new RuntimeException(e)) is a wiser plan,
> though.
>
> The only 'right' way to do it, without ARM or closures, is:
> try {
>     boolean swallowClose = false;
>     InputStream stream = getStream();
>     try {
>         //do stuff here
>     } catch ( IOException e ) {
>        swallowClose = true;
>        throw e;
>     } finally {
>         try {
>             stream.close();
>         } catch ( IOException e ) {
>             if ( !swallowClose ) throw e;
>         }
>     }} catch ( IOException e ) {
>
>    //THIS is where you should handle I/O issues!
>
> }
>
> a handful, isn't it? And can you believe some people are against the
> ARM proposal? I say those people clearly hate life and adore
> boilerplate.

Even after going to all that trouble, an unchecked exception in
the "do stuff here" code could be overwritten by an exception
during close.  (I don't mean to nit-pick, just reinforce the point
that it is a pain to get it right.)

> with arm, that would become:
>
> try ( InputStream stream = getStream() ) {
>     //do stuff here} catch ( IOException e ) {
>
>     //Handle Exceptions here
>
> }

+1

> On Jun 3, 8:30 am, Dominic Mitchell <d...@happygiraffe.net> wrote:
>
>
>
> > On 3 Jun 2009, at 03:55, Christian Catchpole 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);
> > > }
>
> > Most code I've seen uses commons-io's IOUtils.closeQuietly() to do this…
>
> >http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html
>
> > -Dom- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to