[ 
https://issues.apache.org/jira/browse/ARIES-1415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14902695#comment-14902695
 ] 

Christian Schneider commented on ARIES-1415:
--------------------------------------------

You are right that we should not wrap all exceptions in a RuntimeException but 
I think we could do it in a simpler way:

        } catch (Throwable ex) {
            safeRollback(tranToken, ex);
            if (ex instanceof RuntimeException) {
                throw (RuntimeException) ex;
            }
            throw new RuntimeException(ex);
        } finally {

So RuntimeException instances are simply passed to the caller. What do you 
think?

> Exception laundering in JpaTemplate impls
> -----------------------------------------
>
>                 Key: ARIES-1415
>                 URL: https://issues.apache.org/jira/browse/ARIES-1415
>             Project: Aries
>          Issue Type: Improvement
>          Components: JPA
>    Affects Versions: jpa-2.2.0
>            Reporter: Matthew Pitts
>
> Currently XaJpaTemplate and ResourceLocalJpaTemplate wrap all caught 
> exceptions in a  new RuntimeException and throw that instead of the original. 
> This can make it problematic to integrate with code that wants to run txExpr 
> methods and catch specific exceptions - like NoResultException or other type 
> of recoverable exception.
> Perhaps a method (like launderTxException) could be added to their base class 
> - AbstractJpaTemplate - which could allow for additional exception laundering.
> Specifically, I'm thinking of something that would actually attempt to 
> instantiate a new instance of the original exception type via reflection and 
> populate it with the necessary detail message. If it is unable to instantiate 
> the original exception, then it can simply rethrow it as-is or maintain the 
> original behavior of wrapping it in a RuntimeException.
> Something like this:
> {code}
>     protected RuntimeException launderTxException(Throwable original, String 
> message) {
>         if (RuntimeException.class.isInstance(original)) {
>             return wrapTxException(RuntimeException.class.cast(original), 
> message);
>         }
>         else {
>             return new RuntimeException(message, original);
>         }
>     }
>     protected RuntimeException wrapTxException(RuntimeException original, 
> String message) {
>         if (message == null)
>             return original;
>         try {
>             RuntimeException wrapper = original.getClass().getConstructor(new 
> Class[]
>             { String.class }).newInstance(message);
>             wrapper.initCause(original);
>             return wrapper;
>         }
>         catch (ReflectiveOperationException e) {
>             return original;
>         }
>     }
> {code}
> Thoughts, comments, criticisms?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to