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