Is there a better way to throw this exception? (original) (raw)

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