Hi Vincent, I've improved the exception handling as suggested. Checked in SVN trunk.
Best regards, Jerome > -----Message d'origine----- > De : news [mailto:[EMAIL PROTECTED] De la part de Vincent > Envoyé : samedi 22 septembre 2007 05:24 > À : [email protected] > Objet : Re: Unchecked exceptions in Resource constructors > > > Hi Jerome, > > > > } catch (InvocationTargetException e) { > > > if (e.getCause() instanceof Error) { > > > throw (Error) e.getCause(); > > > } else { > > > getLogger() [...] > > > } > > I spoke too fast, we should also consider RuntimeExceptions: > > catch(InvocationTargetException e){ > > if (e.getCause() instanceof Error > > || e.getCause() instanceof RuntimeException) { > > throw (Error) e.getCause(); > > } > > getLogger().... > > } > > This solution doesn't work because if the cause is a > RuntimeException, we can't > cast it to an Error (doh!). And if we rethrow it as a > RuntimeException, it'll > get caught by the catch(Exception e) block of the enclosing try block. > So, the solution is to throw a RuntimeException from the > inner try blok, and let > it bubble up from the outer try block: > > public Resource createResource(Request request, Response response) { > Resource result = null; > > try { > ... > try { > > } catch(InvocationTargetException e){ > if (e.getCause() instanceof Error){ > throw (Error) e.getCause(); > } > if ( e.getCause() instanceof RuntimeException) { > throw (RuntimeException) e.getCause(); > } > getLogger()... > > } > } catch (RuntimeException e){ > // Let unchecked exceptions bubble up > throw e; > } > }catch (Exception e) { > getLogger()... > } > } > > return result; > } > > > In short: we make sure we let all unchecked exceptions > (errors & runtime) flow > through the method, while all checked ones (Exceptions that > are not runtime) are > trapped and logged. We should also document the fact that > Resource constructors > should never throw checked exceptions. > > -Vincent. >

