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