Sorry missed the return after once() in the original code.

David

On 7/06/2013 5:53 PM, David Holmes wrote:
Peter,

On 7/06/2013 12:57 AM, Peter Levart wrote:
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;
         }
     }

But the first call need not throw.

David
-----



Regards, Peter


Thanks
Max

Reply via email to