Is there a better way to throw this exception?

David Holmes david.holmes at oracle.com
Tue Jun 11 05:58:13 UTC 2013


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
>>



More information about the core-libs-dev mailing list