Is there a better way to throw this exception?

Peter Levart peter.levart at gmail.com
Thu Jun 6 14:57:12 UTC 2013


On 06/06/2013 11:42 AM, Weijun Wang wrote:
> Hi All
>
> I have a method that could throw two kinds of checked exceptions and 
> possibly other unchecked ones:
>
>    void once() throws One, Two
>
> Now I have a wrapper method that calls once() for multiple times, and 
> want to throw the first exception if *all* fails. Now it looks like
>
>    void multiple() throws One, Two {
>       Exception saved = null;
>       for (all chances) {
>          try {
>             once();
>             return;
>          } catch (Exception e) {
>             if (saved != null) saved = e;
>          }
>       }
>       if (saved instanceof One) {
>          throw (One)saved;
>       } else if (saved instanceof One) {
>          throw (Two)saved;
>       } else if (saved instanceof RuntimeException) {
>          throw (RuntimeException)saved;
>       } else {
>          // Not likely, but I've already wrote so many lines.
>          throw new RuntimeException(saved);
>       }
>    }
>
> Is there any way I can make it shorter?

Hi Max,

If you don't mind re-throwing the last exception thrown instead of the 
first and you can transform your for loop into a while loop, for example:

     void multiple() throws One, Two {
         int tries = 10;
         int i = 0;
         while (true) {
             try {
                 once();
                 return;
             } catch (Exception e) {
                 if (++i >= tries) {
                     throw e;
                 }
             }
         }
     }


...otherwise you can re-throw the first exception if you can extract the 
first loop iteration out of the loop:


     void multiple() throws One, Two {
         try {
             once(); // first chance
             return;
         } catch (Exception e) {
             for (rest of chances) {
                 try {
                     once();
                     return;
                 }
                 catch (Exception ignore) {}
             }
             throw e;
         }
     }


Regards, Peter

>
> Thanks
> Max




More information about the core-libs-dev mailing list