Puzzles! Probably you can use the new syntax "catch (Ex1|Ex2 ex)" to bind the first exception to a union type. You'll have to split the loop, but you could use a common iterator.
for (Iterator it = all changes; it.hasNext(); ) { try { it.next(); once(); return; } catch (One|Two ex) { while (it.hasNext()) { try { it.next(); once(); return; } catch (One|Two ex) { /*ignore all but 1st*/ } } throw ex; /*throw 1st*/ } } On Jun 6, 2013, at 2:42 AM, Weijun Wang <weijun.w...@oracle.com> 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? > > Thanks > Max